Shell是用户和操作系统之间完成交互式操作的一个接口程。

   bash是Linux操作系统的默认shell程序。

   我们可以使用cat /etc/shells   查看当前系统中所有可以支持的安全shell。

   也可以直接输入shell命令的名字,切换shell

[root@localhost ~]# sh
sh-4.2# bash

  注意:在更换shell时,最好在bash中更换其他shell,若已经切换其他shell,可以用exit命令返回


bash的特性:

    1.alias:定义或显示别名

    当我们只输入alias不加任何参数,则显示所有的命令的别名

[root@localhost ~]# alias
alias cc='mkdir -pv'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

    定义命令别名:alias [别名]='命令 +[参数]'

alias ww='rm -rfv'

    2.unalias:删除命令别名

    使用方法:unalias 命令别名

[root@localhost ~]# unalias ww
[root@localhost ~]# unalias cc
[root@localhost ~]# alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

    定义别名第二类:

    在用户主机中会有一个私有的bash的配置文件,就在用户的家目录中的一个隐藏文件,文件名为.bashrc,其主要功能用来保存用户别名的定义。

    首先我们利用ls -a 找到.bashrc

    随后使用vim编辑命令别名,格式如下299e909e7e82862f1b6b87300c20fae0.png

    然后保存关闭即可

    注意:编辑保存之后,在当前已经运行的bash中并不会立即生效,需要重新加载此文件才能使配置生效。

    具体方法有俩种:

    1.重启bash,注销后再次登录即可

    2.使用source或者.命令执行.bashrc文件 

[root@localhost ~]# . .bashrc
-bash: /root: 是一个目录
-bash: /root: 是一个目录
-bash: /root: 是一个目录
-bash: /root: 是一个目录
-bash: /root: 是一个目录
[root@localhost ~]# alias 
alias cc='mkdir -pv'

bash的快捷键

    

C:Ctrl键

M:Alt键

E:ESC键

DEL:Backspace键


C+l:清屏,相当于clear命令

C+a:将光标跳转至当前行首

C+e:将光标跳转至当前行尾

C+k:删除命令行编辑模式的光标所在位置至行尾的内容

C+u:删除命令行编辑模式的光标所在位置至行首的内容

C+c:结束前台进程

M+.:引用上一个命令中的最后一个参数;(在XShell中不能用)

E+.:功能同M+.

三:命令历史history 命令:保存记录该用户之前使用过的命令

[root@localhost ~]# history
    1  man su
    2    cd 
    3  man cd 
    4  ifconfig
    5  man su
    6  ifconfig
    7  echo
    8  echo -n this time
    9  echo this time
   10  echo -e The year is 2017 \n Today is March 5


重复执行历史缓冲区中的命令

!NUMBER:重复执行历史缓冲区中编号为“NUMBER”的命令

!STRING重复执行历史缓冲区中最近的以“STRING ”开头的命令

!?STRING重复执行历史缓冲区中包含了“STRING”最近的一次命令

!-NUMBER重复执行历史缓冲区中倒数第“NUMBER”条命令

使用上,下键可以从历史缓冲区中调用命令,按回车键执行

C -r:在历史缓冲区中实施搜索,回车后执行

!$:在历史缓冲区中调用最后一个命令的最后一个参数

!^:在历史缓冲区中调用最后一个命令的第一个参数

!:NUMBER:在历史缓冲区中调用最后一个命令的第"NUMBER"个参数

!SEQUENCE:NUMBER:调用历史缓冲区中“SEQUENCE”命令的第“NUMBER”位置参数

[root@localhost ~]# !745
cat a.txt b.txt

[root@localhost ~]# !cat
cat a.txt b.txt

[root@localhost ~]# !^
a.txt
bash: a.txt: 未找到命令...

在bash中与命令历史相关的内置变量

HISTSIZE:历史缓冲区中能够保存的最大条目数量,默认1000

HISTFILESIZE:~/.bash_history文件中能够保存的命令历史的最大条目数量,默认值是1000;

HISTTIMEFORMAT:在命令历史缓冲区中记录历史命令时,同时记录命令执行的时间戳标记;可以使用 date命令的FORMAT来表示时间的记录格式;默认值为空

HISTCONTROL:控制命令历史的记录方式

ignoredups:忽略连续且相同的命令被记录到历史缓冲区;此为默认值

ignorespace:不将把空格开头的命令记录到历史缓存区;

ignoreboth:上述俩种情况都不被记录到缓冲区;

HISTCONTROL使用方法:HISTCONTROL='以上参数'


四:命令补全

    

1.构成命令字符串的补全(TAB键补全)

参考PATH变量中的路径,对命令进行补全;

如果给出的字符串在PATH变量对应的路径中是唯一的,则直接补全命令

如果给出的字符串在PATH变量对应的路径中不唯一的,则bash给出提示

2.命令参数所对应的字符串的补全(补全的是给出的路径)


五:命令行展开

~:bash会自动将其展开为当前登录用户的家目录

[root@localhost ~]# ~
-bash: /root: 是一个目录

~STRING;bash会自动将其展开为以“STRING”为用户名的家目录


  ~+:调用bash内置变量"PWD"的值

  ~-:调用bash内置变量"OLDPWD"的值


 2.{}展开

  在"{}"中,可以填充一个以","分隔的路径列表,bash会将其展开为多个独立的路径

~]# cp 1.txt{,.bak}

     1.txt{,.bak}==1.txt 1.txt.bak

[root@localhost ~]# mkdir -pv /china/{hn,hb,jl,hlj,qhd}/{lin,lina,linb}/class
mkdir: 已创建目录 "/china"
mkdir: 已创建目录 "/china/hn"
mkdir: 已创建目录 "/china/hn/lin"
mkdir: 已创建目录 "/china/hn/lin/class"
mkdir: 已创建目录 "/china/hn/lina"
mkdir: 已创建目录 "/china/hn/lina/class"
mkdir: 已创建目录 "/china/hn/linb"
mkdir: 已创建目录 "/china/hn/linb/class"
mkdir: 已创建目录 "/china/hb"
mkdir: 已创建目录 "/china/hb/lin"
mkdir: 已创建目录 "/china/hb/lin/class"
mkdir: 已创建目录 "/china/hb/lina"
mkdir: 已创建目录 "/china/hb/lina/class"
mkdir: 已创建目录 "/china/hb/linb"
mkdir: 已创建目录 "/china/hb/linb/class"
mkdir: 已创建目录 "/china/jl"
mkdir: 已创建目录 "/china/jl/lin"
mkdir: 已创建目录 "/china/jl/lin/class"
mkdir: 已创建目录 "/china/jl/lina"
mkdir: 已创建目录 "/china/jl/lina/class"
mkdir: 已创建目录 "/china/jl/linb"
mkdir: 已创建目录 "/china/jl/linb/class"
mkdir: 已创建目录 "/china/hlj"
mkdir: 已创建目录 "/china/hlj/lin"
mkdir: 已创建目录 "/china/hlj/lin/class"
mkdir: 已创建目录 "/china/hlj/lina"
mkdir: 已创建目录 "/china/hlj/lina/class"
mkdir: 已创建目录 "/china/hlj/linb"
mkdir: 已创建目录 "/china/hlj/linb/class"
mkdir: 已创建目录 "/china/qhd"
mkdir: 已创建目录 "/china/qhd/lin"
mkdir: 已创建目录 "/china/qhd/lin/class"
mkdir: 已创建目录 "/china/qhd/lina"
mkdir: 已创建目录 "/china/qhd/lina/class"
mkdir: 已创建目录 "/china/qhd/linb"
mkdir: 已创建目录 "/china/qhd/linb/class"



   六:命令的执行结果

bash中,命令的结果有俩种

 1.命令的输出结果:根据用户的需求获取到的命令执行的正常输出结果

        

[root@localhost ~]# echo lll
lll


命令引用或者命令替换

``相当于$()

``:反引号;

   示例:创建一个文件,文件名字为test-系统时间

~]#touch test-`date +%F+%H+%M+%S`

 2.执行命令的状态返回值

与此前的一个命令是否成功执行相关的返回内容

bash使用一个特殊的内置变量来保存其内容:$?

$?实际上保存的是一个数值,其取值范围: 0-255

其中:

0:表示命令执行成功

1-255:表示命令执行失败

1,2,127:bash内置的命令执行失败的状态返回值

1:表示小问题

2:严重问题

127:表示命令本身出现的问题

            其余数字:用户可以自定义的失败状态返回值

[root@localhost ~]# cp a.txt b.txt
[root@localhost ~]# $?
bash: 0


    

    七:引用功能

'':强引用

被单引号引用的内容,bash在处理时,一律视为普通字符,即使其本身是bash定义的具有特殊功能和作用

字符亦是如此,但单引号本身除外

"":弱引用

被双引号引用的内容,有些特殊字符仍然保留其特殊含义


    八:转义功能

\:bash所定义的转义字符:大多数情况下,"\"只能转义其后面的一个字符



\COMMAND:取消命令的别名,而使用命令本身的功能


    九:Globbing--文件名通配符,简称为glob


*:匹配任意长度的任意字符的字符串,(某些特殊位置的"."字符不能匹配)

?:匹配任意的单个字符(某些特殊位置的"."字符不能匹配)

[]:匹配指定范围内的任意单个字符,必须匹配且只能匹配一个字符


指定范围的方法:


1.枚举法:列出所有有效字符

2.范围指定:

[0-9]:表示单个的十进制数字

[a-z]:a,A,b,B,c,C....x,X,y,Y,z

[A-Z]:A,b,B,c,C....x,X,y,Y,z,Z


3.bash内建字符集

  [:lower:]:所有的小写字母

[:upper:]:所有的大写字母

[:alpha:]:所有的字母

[:digit:]:所有的单个十进制数

[:alnum:]:所有的字母和十进制数字

[:punct:]:所有的符号

[:space:]:空白符,包括空格和制表符


4.反向匹配

  ^

示例:~]# ls a[^[:digit:]]??     表示文件名的第二个字符不能是数字


注意:当中括号中有脱字符表示字符集取反向匹配时,要注意*的使用;*的通配范围会导致

[root@localhost ~]# ls [:alnum:]??
a b

[root@localhost ~]# ls a????
a.txt

aaaaa:

    十:管道

   |

管道通常连接多个命令的;将管道符号前面的命令的执行的输出结果通过管道传递给管道符号后面的命令

,让后面的命令将前面的输出结果当做参数来使用



wc命令: 

wc - 输出文件中的行数、单词数、字节数

格式:wc[OPTION]...[FILE]...

常用选项:

-c,--byte:仅显示文件中的字节数

-m,--chars:仅显示文件中的有效字符的数量

-l,--lines:仅显示文件的行数

-w,--words:仅显示文件中字的数量



注意:1.一般来讲,凡是被管道连接的命令,都应该在执行成功之后完成命令结果的输出,否则管道无意义

     2.管道不是万能的,有些场合无法使用管道


    十一:输入输出重定向

在使用计算机的时候,实现某个功能的主体是程序!

程序=指令+数据

数据至关重要!





文件,IO-Input/Output

在Linux系统中,能够完成输入和输出功能的实体:文件


可以用于输入的设备:文件

键盘,文件系统中的常规文件,网卡设备,声卡设备,磁盘设备

可以用于输出的设备:文件

显示器,文化系统中的常规文件,网卡设备,声卡设备,磁盘设备


在内存中使用文件的方式是定义文件描述符,一个文件描述符对应一个文件;

0:表示标准输入,stdin  从键盘输入的数据流

1:表示标准输出,stdout 到显示器的输出数据流

2:表示标准错误,stderr 到显示器的错误数据流



  输入输出重定向:采用非标准设备实现的IO操作


输入重定向

<

输出重定向

>:覆盖输出重定向

~]# set -C   开启防止意外覆盖原文件的开关  可以使用">|"完成覆盖重定向输出的操作,

            无需关心是否开启此开关

~]# set +C   关闭防止意外覆盖原文件的开关

>>:追加输出重定向

错误重定向

2>:覆盖错误重定向

2>>:追加错误重定向

  合并标准输出和标准错误的重定向:

1.COMMAND{>|>>}/PATH/TO/SOMEFILE 2>&1

2.&>,&>>


特殊的设备文件

/dev/null: BlackHole,BitBucket(垃圾桶)

/dev/zero: 泡泡机,吐零机;


bash中的其他特殊符号

<<:here document ,此处文档,结束标记

<<<:here string,此处字符串,结束标记