shell的bash特性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell的bash特性相关的知识,希望对你有一定的参考价值。

    shell是操作系统最外面的一层,操作系统与外部最主要的接口就叫做shell,SHELL有很多种,作为操作接口,为用户提供简单易用的操纵界面,常指的是命令行界面的解析器。shell提供访问内核服务的程序,可以分为两类:命令行与图形界面,命令行壳层提供一个命令行界面(CLI);而图形壳层提供一个图形用户界面(GUI)。

    

     下面是shell的bash脚本特性:

     一、命令的(自定义命令)---------alias

alias命令可以用来定义和显示命令的别名,但使用alias命令定义的别名,其生命周期仅为当期SHELL的生命周期,

如果别名与命令名相同时,直接调用原命令,而非别名,可使用"\COMMAND"

对于每个用户来说,都有一个私有的bash配置文件,用于保存别名

ll足以完成ls -l的作用

例子:~/.bashrc

注意:1alias命令的效果仅限于当前shell的生命周期

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

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

 

  撤销别名:

     unalias unalias命令的效果仅限于当前shell的生命周期

     例如:unalias  NAME

     . 命令即source (加载)

 二、命令历

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

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

   登录shell的时候,bash会自动读取~/.bash_history文件中所记录的所有命令,history:当前用户的命令历史文件;                                                                                                                                              ~/.bash_history

  

 history命令:

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

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

     例子:history -d 9(删除第9行)

           history 10(显示第10行)

   ! 在bash中默认为从历史缓冲区中读取数据

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

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

2Ctrl+p

3!-1(倒数第一条)

4!!

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

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

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

 例如:!type(往前找到第一个type开头的开始)

       或写成!ty

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

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

    例如:!-10

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

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

!$: 表示最后一次命令中最后一个参数

!$的快捷键实现方式为:ESC. (顺次摁)

                      Alt+.(同时摁)

!^:表示第一个位置的参数

  例如:touch a b c d

        ls: !^------->输出a

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

!SEQNUMBER:NUMBER  表示在历史缓冲区中第“SEQNUMBER”个命令的第“NUMBER”个参数

   例如:rm -f !39:1(删39行第一个)

!*  引用上一条命令的所有参数

同理有 !STRIGN:^|$|*|NUMBER

 

 与历史有关的bash变量

HISTSIZE:缓冲区大小,变量(就是一段内存空间)

    例如:echo $HISTSIZE(输出容量如1000

HISTFILESIZE:文件大小

HISTTIMEFORMAT(保存时间格式),保持系统时间

     HISTTIMEFORMAT=%F %T

HISTCONTROL(历史记录控制方式)

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

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

     ignoreboth: 以上两个功能都启用

三、bash快捷键(键盘映射)

  C------>Ctrl(后面为键盘中的按键表示)

  M----->Alt

  E-------->ESC

  DEL-------->Backspace

C-l: clear 清屏的快捷键

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

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

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

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

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

 

四、命令补全机制

 两个方面的理解:

    1)命令本身字符串的补全

2)参数的补全

 Shell命令的执行过程:

1shell会根据用户键入“ENTER”来判断用户的输入结束

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

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

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

使用tab进行命令补全

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

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

  Tab------->搜索补全,路径下的参数也是可以补全的

  

 

五、命令行展开

  ~bash会自动将其展开为当前目录下的家目录

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

  ~+:调用SHELL变量“PWD”的值

  ~-:调用SHELL变量“OLDPWD”的值

       例如:cd -

 

  {} 展开功能:

       在花括号中,可以填充一个以逗号“,”字符分隔的路径列表,bash会将其展开为多个独立路径

       例子:创建a_ca_db_cb_d四个目录

             mkdir -pv /tmp/{a,b}_{c,d}

六、命令的执行结果

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

其一:命令的正常输出结果;

      跟用户需求相关的返回内容

      `:反向单引号,反引号(英文下的~键) 

               例如:I am `whoami(输出I am root

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

                                    例如:I am $(whoami)(输出I am root

    wc: (相似与cat)统计一个文件中的行数,字数及其字节数

       -c:只显示字节数

       -l:只显示行数

       -w:只显示字数

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

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

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

      0表示命令执行成功,

      12127都表示失败,bash内置状态返回值

        1 表示小问题

        2 表示严重问题

        127 表示命令本身出问题

      3-126128-255 用户自定义状态信息

 

七、引用功能

 :强引用

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

    例如:  (错) 应该为  

 : 弱引用

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

    例如:  (错) 应该为  


 

八、转义功能:

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

\$$PATH(一个只使一个字符失去特殊意义)

\$\$PATH(两个$都失去特殊意义)

$$$$$$$$PATH 单引号就比较方便,不用多个\逐个消除

 

九、Globbing (文件名通配,简称glob)

   元字符:

      *:匹配任意长度(可以为0,即无字符也可以)的任意字符,某些特殊位置的“.”字符不能被匹配(匹配 . 要用 .*  *要在后面)

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

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

        例如:[a-z]:实际指的是aAbBcC……z(但是不包含大Z

              [A-Z]: 实际指的是 AbBcC……zZ(但是不包含小a

      字符集:[::]

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

        例:[[:lower:]](注意两对中括号)

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

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

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

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

     [:space:] 表示空白字符

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

    ^:(脱字符)表示取反匹配(含于中括号里面)

      例如:[^a]

   例如:以非字母开头,且其后跟了一个字母,以及其他的为任意字符的文件名

      #ls-d/etc/[^[alpha]][[alpha]]*

 

十、输入输出重定向

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

数据:文件(一切皆文件)----------需要IO

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

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

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

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

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

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

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

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

    

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

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

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

 

文件描述符:File DescriptorFD

0:标准输入,即stdin

1:标准输出,即stdout

2:标准错误,即stderr

 

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

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

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

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

输出重定向:(可以建文件)

     >:覆盖输出重定向

        例如:~]# set  -C    //开始防误覆盖开关

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

        例如:~]# set  +C    //关闭房屋覆盖开关

     >>:追加输出重定向

  错误重定向:

      2>:覆盖输出重定向

      2>>:追加错误重定向

      例如:# lss  >  /tmp/lss.out

            # lss  2>  /tmp/lss.out

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

      1&> 覆盖, &>> 追加

      2COMMAND  >|>>  /PATH/TO/SOMEFILE  2>&1     (相对较少,比较老旧)

 

  /dev/null BlackHoleBitBacket(位桶)

     例如:ls  /tmp/a.txt  &>  /dev/null 等价于 ls  /tmp/a.txt  >  /dev/null  2>&1

 

输入重定向:

<:  例如: cmd<file----->使cmd命令从file读入

<<Here Document(此处文档)遇到结束

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

 

十一、管道

|

   COMMAND1|COMMAND2|COMMAND3|……

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

     tee

            tee命令的作用是在不影响原本I/O的情况下,将stdout(文件描述符)复制一份到档案去



以上是关于shell的bash特性的主要内容,如果未能解决你的问题,请参考以下文章

Bash shell 相关特性

bash的特性

Linux之bash特性

5自学——Linux的学习进度与任务shell中bash的特性

Linux基础3-1 Bash及其特性

Linux基础3-1 Bash及其特性