linux基础之bash特性

1、命令历史

命令历史包含的环境变量

  $HISTSIZE:命令历史记录的条数

  $HISTFILE:命令历史文件~/.bash_history

  $HISTFILESIZE:命令历史文件记录历史命令的条数

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

  关于这个$HISTCONTROL环境变量值的介绍:

    ignoredups:设置为这个值时,忽略重复的命令记录到命令历史中,这重复的命令必须是连续的,也就是挨着的($HISTCONTROL默认是ignoredups这个值)

    如何设置:

      export  HISTCONTROL=”ignoredups”

    ignorespace:设置为这个值时,忽略所有以空白字符开头的命令记录到命令历史中

    如何设置:

      export  HISTCONTROL=ignorespace

    ignoreboth:设置为这个值时,上面两个之所对应的功能都生效

    如何设置:

      export  HISTCONTROL=”ignoreboth”

  命令历史的使用

    history  -d  num :清除命令历史记录中指定的命令历史编码数

    history  -c:清除所有命令历史记录

    histroy  num:显示历史命令记录中最近num条记录

    history  -a:手动追加当前会话命令历史缓冲区的命令到命令历史文件

  命令历史的快捷键

    !!:调用上一次使用的命令

    !+num:调用历史命令记录中编号为num的命令

    !+string:调用命令历史记录中最近一次使用的以string为开头的命令

    !+$:调用上一条命令的最后一个参数的快捷键

    ESC+ . :调用上一条命令的最后一个参数的快捷键,按键盘上ESC键,松开后再按点号

    ALT+ . :调用上一条命令的最后一个参数的快捷键,按键盘上ALT键,不松开接着按点号(可能有些不管用)

 

2、命令补全

  命令补全使用方式:当我敲击一个命令时,可以写前几个字符,然后使用tab键补全

  命令补全的实现机制:bash根据PATH环境变量定义的路径,自左向右的在每个路径下搜索以给定字符为开头的对应的命名二进制可执行文件,如果找寻了所有路径只包含一个,那么直接补全,如果包含多个,那么在使用一次tab键,打印给定字符包含的所有可执行命令

  bash执行命令过程

    外部命令:bash根据PATH环境变量定义的路径,自左向右的在每个路径下搜索以给定命令命名二进制可执行文件,第一次找到即为要执行的命令

 

3、路径补全

  路径补全的实现机制:把用户给出的字符串当做路径的开头,并在其指定上级目录下搜索以指定的字符串开头的文件名,如果唯一则按tab键补全路径,如果不唯一则需要再按一下tab键,此时会列出以这个字符串开头的所对应的文件列表。

  注意:他还有一个特殊的机制,那就是当我们给定的字符串搜索时,如果这个目录下的所有文件包含这个字符串,同时还包含了其他相同字符,那么再按一下tab键会补全到所有相同字符串的位置

4、命令行展开

  ~:展开为用户的家目录

  使用案例

[root@oldboy ~]# cd ~oldboy

[root@oldboy oldboy]# pwd

/home/oldboy

  

  {}:可承载一个以逗号分割的列表,并将其展开为多个路径

  使用方式

    /tmp/{a,b}   展开为  /tmp/a  /tmp/b

    /tmp/{tom,jerry}/ha  展开为  /tmp/tom/ha   /tmp/jerry/ha

5、命令执行结果状态

  命令执行后的结果无非两种,成功或者失败,bash使用特殊变量$?保存最近一条命令执行的状态结果

  状态码

    0:表示成功

    1-255:表示失败

  程序的执行有两类结果

    一类是:程序的返回值

    另一类是:程序的执行状态结果

 

6、命令别名-alias

  基本介绍

    命令取的另外一个名字,我们可以把很长的命令格式,通过一个别名,把它简化为一个简短的名字。

  基本用法

    alias [-p] [name[=value] ... ]

  常用参数

    -p:打印所有定义的别名

  使用注意

    alias命令是一个内建命令,如果alias不带任何参数或者选项表示列出所有的别名,如果要定义别名使用alias 命令简写=命令长格式

    在命令行定义的别名仅对当前shell进程有效。如果想永久有效,需要定义在配置文件中

  配置文件有两种:

    仅对当前用户有效

      ~/.bashrc

    对所有用户有效

      /etc/bashrc

    任何修改配置文件,只能被新进程或者让新进程重新读取才生效(这里的进程指的是bash进程)

    让bash进程重新读取使用source命令

      source  配置文件

      .  配置文件

    注:新配置的配置文件不会立刻生效,需让bash进程重新读取才会生效

    撤销别名:unalias

      unalias  别名 :撤销指定别名

      unalias  -a:撤效全部定义的别名

  注意:如果不想使用别名,但是又不想去除别名定义,那么可以在使用别名前加一个反斜线[ ],或者补全命令的全路径

7、Glob

  基本介绍

    bash中用于实现文件名通配

    基本使用

  通配符

    *

      基本介绍

        匹配任意长度的任意字符

      基本使用

        a*c   表示 a111casdcac等,但是不表示acb

    ?

      基本介绍

        匹配任意单个字符,必须包含单个字符

      基本使用

        a?b  表示  acbadb等,但是不表示adbcacnbab

    []

      基本介绍

        匹配指定范围内的任意单个字符,如果范围内是小写字母,那么是不区分大小写的,如果范围内是大写,那么只是取大写范围。

        注意:如果要匹配连字符[ - ],那么要使用转义符号

      案例演示

        a[-cv]b   表示匹配  a-bacbavb

      基本使用

        [abc]   表示  abc等,但不表示abacabc

        a[a-z]c  表示  aCcaccaDcadc

    [^]

      基本介绍

        匹配指定范围之外的任意字符

      基本使用

        a[^0-9]  表示  aba^a@等,不表示a1a2

    专用字符集合表示法

      [:digit:]:任意数字相当于0-9,这里只表示数字,不是匹配数字,匹配数字要写成[[:digit:]]

      [:lower:]:任意的小写字母,这里只表示小写字母,不是匹配小写字母,匹配小写字母要写成[[:lower:]]

      [:upper:]:任意的大写字母,这里只表示大写字母,不是匹配大写字母,匹配大写字母要写成[[:upper:]]

      [:alpha:]:任意的大小写字母,这里只表示大小写字母,不是匹配大小写字母,匹配大小写字母要写成[[:alpha:]]

      [:alnum:]:任意的数字和字母,这里只表示数字和大小写字母,不是匹配数字和大小写字母,匹配数字和大小写字母要写成[[:alnum:]]

      [:space:]:任意的空格,这里只表示空格,不是匹配空格,匹配空格要写成[[:space:]]

      [:punct:]:任意的标点字符,这里只表示标点符号,不是匹配标点符号,匹配空格要写成[[:punct:]]

      案例演示

        列出/var目录下,非字母开头,后面跟任意单个字母的txt文件

          ls  -l  /var/[^[:alpha:]][[:alpha:]].txt

8、bash的快捷键

  ctrl+l:清屏操作,相当于clear命令

  ctrl+a:将光标跳转至命令的首部

  ctrl+e:将光标跳转至命令的尾部

  ctrl+c:取消命令执行

  ctrl+u:删除光标所在位置之前的全部字符

  ctrl+k:删除光标所在位置之后的全部字符

 

9、输入、输出重定向及管道

  程序是由指令加数据组成,那么程序都有读入数据的需求(Input),程序也有输出数据的需求(Output

  程序读入数据的来源有很多:文件、用户键盘输入等

  程序输出数据的地方有很多:保存至文件、输出到屏幕

  那么程序读入数据或者输出数据的选择就有很多,如果程序每一次执行时都需要指定程序读入数据或者输出数据的来源或者去处,这样会很麻烦,因此,就会有缺省或者说默认的值

  缺省输入或者默认输入叫做标准输入默认的或者缺省的输入是键盘输入

    比如说cat命令,这里可以说是cat程序,如果你不指定文件,也就是数据来源,那么它默认从键盘获取你的输入。但是有些命令自身具有默认的数据输入位置,比如ls命令,如果不给定ls命令输入的数据,那么默认以当前位置为输入数据

  缺省输出或者默认输出叫做标准输出,默认的或者缺省的输出是监视器(monitor

  默认的错误输出或者缺省的错误输出叫做标准错误输出

  不管是bash报错还是某个命令自身报错都属于标准错误输出,这个输出是与标准输出不相瓜葛的输出,即是一个独立的输出数据流,但是他的输出位置默认是监视器(monitor

 

I/O重定向:改变标准输入或者标准输出的位置 

  输出重定向( >>> )

  语法

    COMMAND  >  new_pos

    COMMAND  >>  new_pos

  分类

    >:表示覆盖重定向,目标文件原有内容会被覆盖

  案例演示

  

[root@oldboy ~]# ls /var > /tmp/var.txt

    >>:追加重定向,在目标文件原有内容下追加新内容

  案例演示

[root@oldboy ~]# ls /etc/ >> /tmp/etc.txt

  

  注意:输出重定向是非常危险的操作,误操作就可能把你的重要数据给覆盖了。

  问题:bash中有没有可以设置关闭和打开这个输出重定向功能呢?

    解决方式

      set  -C 命令:禁止将内容覆盖输出到已有文件内容,但是不存在的文件是可以进行输出重定向的,这个对标准错误输出也起作用

    另外一个现实:

      输出重定向新问题:bash支持强制输出覆盖:>|

        案例演示

          cat  /etc/fstab  >|  /tmp/a.txt

    set  +C命令:关闭禁止将内容覆盖输出到已有文件内容,也就是可以覆盖输出到已有内容的文件

  标准错误输出

    当我们执行一条有时命令会报错,但是这个错误输出默认是输出到监视器,那么我们怎么重定向这个标准的错误输出呢?

    标准错误输出重定向

      语法

        COMMAND  2> new_pos

        COMMAND  2>> new_pos

      分类

        2>:表示覆盖重定向错误输出流,目标文件原有内容会被覆盖

      案例演示

[root@oldboy ~]# ls /varr 2> /tmp/var.txt

        2>>表示追加重定向错误输出流,在目标文件原有内容下追加新内容

      案例演示

[root@oldboy ~]# ls /etcc/ 2>> /tmp/etc.txt

      我们想把错误的输出或者正确的输出到不同位置

        语法

          COMMAND  >>  new_pos  2>> err_new_pos

          COMMAND  >  new_pos  2>  err_new_pos

 

      错误或者正确的输出流合并至同一个数据流进行重定向

        语法

          COMMAND  &>  new_pos

          COMMAND  &>>  new_pos

          COMMAND  > new_pos  2> &1

          &>:覆盖重定向

          &>>:追加重定向

           2> &1:表示将标准错误的输出流导向与标准输入出流同一个地方,而标准输出流导向了一个文件,那么标准错误输出流也导向与标准输出流同样的地方

 

    输入重定向

      输入重定向使用的意义:有些命令在执行时不能够带文件作为参数的命令,默认只能从标准输入中读数据,那么我们可以强行使用输入重定向让他从文件获取数据

    语法

      COMMAND  < old_pos

        old_pos为一个文件或者其他数据来源

      输入重定向有没有使用两个小于号的必要?其实是有的,<<)两个小于号是用来创建文档的

    案例演示

[root@oldboy ~]# cat <<EOF

> 123

> asd

> qe

> 123

>

> EOF

123

asd

qe

123

    这个有什么用呢?

      默认从键盘键入的字符,输出到的是监视器上,那么我们可以将这些输出的字符重定向到我们指定的文件

    案例演示

    

[root@oldboy ~]# cat >> /tmp/b.txt <<EOF

> hello world

> are you ok?

> thanks

> byebye

> EOF

[root@oldboy ~]# cat /tmp/b.txt

hello world

are you ok?

thanks

byebye

    管道

      基本介绍

        我们可以将一个命令的输出当做另一个命令的输入,并且这个样无限下去

      基本语法

        COMMAND1  |  COMMAND2  |  COMMAND3....

      使用案例

[root@oldboy ~]# echo $PATH | tr 'a-z' 'A-Z'

/USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN

 

未完,待续...... 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程