在使用linux系统中大多都是通过文本页面输入命令来进行操作,linux默认的shell就是bash,所以我们有必要对shell进行深入了解

bash特性:

一、命令别名:(自定义命令)

    alias命令可以用来定义和显示命令的别名。但是使用alias命令定义的别名,其生命期仅为当前shell的生命期;


    每个用户都有一个私有的bash配置文件,用于保存别名;~/.bashrc


注意:

        1.alias命令的效果仅限于当前shell的生命期;

2.如果修改.bashrc配置文件,其中保存的别名并不会立即生效,只有在重新加载该文件的内容之后,才会生效,且永久生效;

3.为了能够保证我们设置的别名有效,通常两种操作都要做;


撤销别名:

unalias:

unalias NAME


二、命令历史:

BASH进程会保存其会话中用户曾经执行过的命令,以方便用户重复执行某个命令;

通过BASH提供的历史命令文件来持久保存此前执行过的命令,每个用户都有其自己私有的历史文件;

登录shell的时候,BASH会自动读取~/.bash_history文件中所记录的所有命令;


history命令:

-c:清空历史缓冲区中的历史命令;

-d OFFSET:删除特定历史命令条目;


       重复执行前一个命令的方法:

1.使用上方向键,回车执行;

2.Ctrl+p

3.!-1

4.!!


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

!NUMBER:重复执行历史命令中编号为"NUMBER"的命令;

!STRING:从历史缓冲区中查找最近一次执行过的以"STRING"开头的命令,并执行;

!?STRING:从历史缓冲区中查找最近一次执行过的包含"STRING"的命令,并执行;

!-NUMBER:执行历史缓冲区中单数第"NUMBER"条命令;

                Ctrl+r:在历史缓冲区中实施搜索,回车执行即可;


重复使用历史命令中的一部分:

!$:表示最后一次命令中最后一个参数;ESC, . Alt+.

!^:表示最后一次命令中第一个位置的参数;

!:NUMBER:表示最后一次命令中第"NUMBER"个位置的参数;


!SEQUENCE:NUMBER:表示在历史缓冲区中第"SEQUENCE"个命令的第"NUMBER"个参数;

!STRING:^|$|*|NUMBER:


与历史相关的bash变量:

HISTSIZE:

HISTFILESIZE:

HISTTIMEFORMAT:

HISTTIMEFORMAT="%F %T "

HISTCONTROL:

ignoredups:忽略连续且相同的命令的历史缓存;

ignorespace:忽略以空白字符开头的命令;

ignoreboth:以上两个功能都启用;


三、快捷键:

C-->Ctrl

M-->Alt

E-->ESC

DEL-->Backspace

        C-l:clear,清屏;

C-a:将光标跳转至命令行的行首;

C-e:将光标跳转至命令行的行尾;

C-k:删除光标所在位置至行尾的命令行信息;

C-u:删除光标所在位置至行首的命令行信息;

C-c:结束前台进程,取消命令的运行;


四、命令补全机制:

两个方面的理解:命令本身的字符串的补全: 参数的补全

        SHELL命令的执行过程:

         1.SHELL会根据用户键入"ENTER"来判断用户的输入结束

2.SHELL会将收集的命令信息,根据空白字符来分段(token),第一个分段被理解为命令字段;

3.判断第一个字段是内部命令还是外部命令,如果是内部命令,则直接运行;如果是外部命令,通过PATH变量所指示的路径信息,去查找相关的位置,以确定是否存在同名文件,如果有,就执行;否则,就报错;

4.判断选项是否正确,判断参数是否正确;


使用TAB键可以完成命令补全:

如果给出的字符串不能作为唯一标识,则bash不予补全;再次敲击TAB键,bash会给出参考列表;如果参考列表中的内容过多,bash会询问是否显示该列表;


根据提供的参数路径来进行补全,如果参数没有任何提示信息,则默认从工作目录进行查找;


五、命令行展开:

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

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

~+:调用SHELL变量"PWD"的值;

~-:调用SHELL变量"OLDPWD"的值;


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


六、命令的执行结果

任何一个Linux命令都有两种执行结果:

其一:命令的正常输出结果;跟用户需求相关的返回内容

``:反向单引号,反引号

$():标准的命令引用格式


wc:统计一个文件中的行数、字数及字节数;

      -c:只显示字节数;

-l:只显示行数;

-w:只显示字数;


其二:命令的执行状态返回值;

跟命令执行成与否相关的返回内容;

保存在bash的一个特殊变量中:$?

0-255

0:命令执行成功 ;1,2,127:bash内置状态返回值;

1:表示小问题;

2:表示严重问题;

127:表示命令本身出问题;

3-126,128-255:用户自定义状态信息;


七、引用功能:

'':强引用 : 凡是被单引号引用的内容,bash一律将其视为普通字符,即便其本身有特殊功能和作用也是如此。但单引号本身是个例外。

'''

"":弱引用 : 被双引号引用的内容中,有些特殊字符仍然会保留其特殊含义,比如说:$、\、"


八、转义功能:

        \:bash中定义的转义字符;只能使其后一个字符失去特殊意义;


九、Globbing,文件名通配,简称为glob;

元字符:

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

?:匹配任意单个字符,必须且只有一个字符被匹配;

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

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

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


字符集:

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

 [[:lower:]]:通配任意单个小写字母

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

[:alpha:]:表示所有字母字符

[:digit:]:表示所有的十进制数字

[:alnum:]:表示所有的大小写字母以及十进制数字

[:space:]:表示空白字符

[:punct:]:所有的标点符号


^:取反匹配


十、输入输出重定向

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

       程序= 指令 + 数据

       数据:文件,IO

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

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


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

显示器、文件系统中的常规文件、网卡设备、声卡设备等;


每一种程序都有三种形式的数据流:

输入数据流:为程序获取数据的数据流;默认的输入数据流的来源就是键盘;

输出数据流:将程序所处理的数据结果展示给用户的数据流;默认的输出数据流的终点是显示器;

错误数据流:将程序无法处理或处理过程中出现问题的结果展示给用户的数据流;默认的错误数据流的终点是显示器;


从键盘实现的输入数据流称为标准输入;

到显示器上的输出数据流称为标准输出;

到显示器上的错误数据流称为标准错误输出,简称标准错误;


        文件描述符:File Descriptor,FD

0:标准输入,stdin

1:标准输出,stdout

2:标准错误,stderr


IO重定向:采用非标准设备文件实现的IO操作;


简单来说:

不是从键盘设备完成的数据流输入就可以称为输入重定向或重定向输入;

不是到显示器设备的正确输出数据流就被称为输出重定向或重定向输出;

不是到显示器设备的错误输出数据流就被称为错误重定向或重定向错误;


输出重定向:

>:覆盖输出重定向

~]# set -C   //开启防误覆盖开关

  在此开关开启后,可以使用">|"符号继续覆盖重定向

~]# set +C   //关闭防误覆盖开关

>>:追加输出重定向


错误重定向:

2>:覆盖错误重定向

2>>:追加错误重定向


合并标准输入和标准输入的重定向:

1) &>,&>>

2) COMMAND >|>> /PATH/TO/SOMEFILE 2>&1


/dev/null:BlackHole,BitBucket(位桶),


ls /tmp/a.txt &> /dev/null

||

ls /tmp/a.txt > /dev/null 2>&1


      输入重定向:

<:


<<:Here Document(此处文档)


<<<:Here String(此处字符串)

十一、管道

|:

COMMAND1 | COMMAND2 | COMMAND3 | ...


注意:所有的用于管道连接的命令,都应该是能够有标准输出数据流的命令;

 

十二、bash特性之变量

  程序 = 指令 + 数据

  数据:文件, 变量

  变量:一段连续的内存空间,为这一段空间取名,称为变量名;在这内存空间存储的数据称为变量值

  赋值操作:=

  = :赋值操作符

  赋值方法:VARNAME=VALUE

  VARNAME的命名规范:

  1. 只能以字母或“_”为首字符,不能使用数字,后面可以是任意字母、数字、下划线

  2. 大小写严格区分

  3. 见名知意

  4. 书写规范:

     1)全大写:FILES

     2)驼峰式:MyFiles

  5. 不能与已知变量名相同

 根据不同的编程语言,变量可以分为两类;

   强变量:

  必须在使用前声明,而且要声明其类型,严格区分变量类型

   弱变量:可以随时使用随时声明,甚至可以不声明就使用,不对变量类型做硬性要求,如果没有指定变量类型,统一按字符型对待


  bash变量即为弱变量

  引用变量的值:${VARNAME} ==> $VARNAME,也称为变量替换;

  bash的变量种类:

    全局变量(环境变量):作用范围是整个shell进程,包括其子shell

    本地变量:作用范围仅包括当前登录的shell,不包含子shell

    局部变量:作用范围仅仅只是作用当前的程序段,一般用于函数

    默认全局变量:

        位置参数变量 :$1,$2,$3 ....$n

        特殊变量:

        $?, $#, $*, $@, $$,....

        $? :展开为最近一次所执行的命令的状态返回值(退出状态)

        $# :位置参数的个数,以十进制表示

        $* : 从1开始展开为位置参数,当时双引号来引用展开的时候 它展开为以特殊变量”IFS“的第一个字符分隔的值

        $@ : 从1开始展开为位置参数,当时双引号来引用展开的时候 它展开为一个单独的字符串

        $$ : 展开为当前shell的进程标识符

        $0 : 展开为shell或shell脚本名

   变量的使用:

     变量的赋值: VARNAME=VALUE,  声明本地变量(仅当前shell可以使用)

     撤销变量: # unset VALNAME


     声明环境变量:(可应用于当前shell及各子shell,仅当前bash)

        export VARNAME

         export VARNAME=VALUE

        declare

           -a :声明索引数组 (如果支持)

           -A :声明关联数组 (如果支持)

           -i : 声明整型变量

           -l : 声明变量并将变量值中的字符转换为小写字母

           -u :声明变量并将变量值中的字符转换为大写字母

           -x : 声明变量并将其导出为环境变量

           -r : 声明变量为只读变量(常量)


    查看环境变量

       set

       export

       env

   声明局部变量:

      local VARNAME=VALUE


    配置文件:

      通用配置文件: /etc/bashrc   、 /etc/profile

      私人配置文件: ~/.bashrc    、 ~/bash_profile


   注意 : 一般情况下,声明变量都是现做现用,并不需要修改配置文件