bash的基础特性

1、命令别名

  1、获取当前shell进程的所有可用别名的定义:

    # alias

  2、定义别名,其相当于执行命令VALUE

    # alias NAME='COMMAND'

    注意:定义别名仅对当前shell进程有效,如果想永久有效,要定义在配置文件中,配置文件有两种:

    1、仅对当前用户有效:~/.bashrc

    2、对所有用户有效:/etc/bashrc

    注意:编辑配置文件给出的新配置不会立即生效,要打开一个新进程

      bash进程重新读取配置文件:

        # source /path/to/config_file

        # ./path/to/config_file

  3、撤销别名

   # unalias [-a] name [name ...]

    注意:如果别名和原命令相同,如果要执行命令,可使用“\COMMAND”

2、命令历史:history

shell进程会其会话中保存此前用户提交执行过的命令

historyshell的内置命令

       1. 命令语法格式:

  history [-c] [-d OFFSET] [n]

  history -anrw [FILENAME]

  history -ps VALUE [VALUE...]

  -c: 清空命令历史;

  -d offset(偏移量):删除指定命令历史offsethistory显示出来的命令数字

  -r: 从文件读取命令历史至历史列表中;

 -w:把历史列表中的命令追加至历史文件中;

history #:显示最近的#条命令;

      2. 相关环境参数,实现定制环境变量的功能

HISTSIZE:shell进程可保留的命令历史的条数;

HISTFILE:持久保存命令历史的文件,默认为.bash_history

HISTFILESIZE:命令历史文件的存储历史命令数量条数;

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

ignoredups:忽略重复的命令;

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

ignoreboth:以上两者同时生效;

       3. 调用命令历史列表中的命令

    !#:再一次执行历史列表中的第#条命令;

   !-#执行倒数第几条命令;

    !!:再一次执行上一条命令;

    !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;

            注:命令的重复执行有时候需要依赖于幂等性;

 4. 调用上一条命令的最后一个参数:

       快捷键:ESC, .

ALT+.  远程终端可能不支持该方法

       字符串:!$

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

  环境变量:HISTCONTROL

              ignoredups:忽略重复且连续的命令;

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

                                   ignoreboth:以上两者同时生效;

3、补全特性

  1、命令补全:

    bash执行命令:内部命令;外部命令——bash根据PATH环境变量定义的路径,自左而右的在每个路径搜寻以给定命令命名的文件,第一次找到的即为要执行的命令。

    补全方式:

      1、直接补全:Tab键——用户给定的字符串只有一个唯一对应的命令

      2、以用户给定的字符串为开头对应的命令不唯一,则再次Tab键

 2、路径补全

  把用户给出的字符串当做路径的开头,并在其指定的上级目录下搜寻以指定的字符串开头的文件名,如果唯一,则直接补全,反之则再次Tab键,给出列表

  3、命令行展开

  ~:自动展开为用户的家目录,或指定的用户的家目录;                

   {}:花括号展开。可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

4、命令执行状态结果特性

   1.bash通过状态返回值来输出此结果:

成功:0

失败:1-255

注意:命令正常执行时,有的还会有命令返回值:

                根据命令及其功能不同,结果各不相同;

    2.态返回值保存于bash的特殊变量$?

    3.引用命令的执行结果:$(COMMAND)      `COMMAND`

5、快捷键 

Ctrl+a:跳转至命令行行首

Ctrl+e:跳转至命令行行尾

Ctrl+u:删除行首至光标所在处之间的所有字符;

Ctrl+k:删除光标所在处至行尾的所有字符;

Ctrl+l:清屏,相当于clear

6、文件名通配特性

  globbing:文件名通配(整体文件名通配,而非部分)

  通配符,匹配模式:元字符(touch):具有特殊意义的专用字符,可以用来规定其前导字符在目标对象的出现模式

  • *:匹配任意长度的任意字符

         pa*, *pa*, *pa, *p*a*

         pa, paa, passwd
  • ?:匹配任意单个字符

        pa?, ??pa, p?a, p?a?

        pa, paa, passwd
  • []:匹配指定范围内的任意单个字符

          有几种特殊格式:

    [a-z]:不区分大小写

    [A-Z]:大写字母

    [0-9]

    [a-z0-9]:特殊字符

    最外面的中括号[]表示一个集合,里面的中括号则是固定格式:

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

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

                                       [[:alpha:]]:所有字母

                                       [[:digit:]]:所有数字

                                       [[:alnum:]]:所有的字母和数字

                                       [[:space:]]:所有空白字符

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

                                       pa[0-9][0-9], 2[0-9][0-9]

  • [^]:匹配指定范围外的任意单个字符

                                [^[:upper:]]

                                [^0-9]

                                [^[:alnum:]]

 

7、管道及文本处理工具

  1、概念理解:

    • IO重定向:将执行的结果重新定向输出在别的设备上,可以是文件也可以是其他设备
    • 一切皆文件,包括设备都可以作为IO重定向文件
    • 在Linux中打开一个文件,在该文件被加载完成后对于系统来说需要用一个数字表示,这个数字叫做fd:file descriptor 文件描述符。因为Linux系统中一切皆文件,所以对应的标准输入设备,标准输出设备,错误输出设备都有其对应的fd

  1、标准输入:键盘 keyboard——0

    2、标准输出:monitor——1

    3、标准错误输出:monitor——2

    • 数据流:通常描述的信息本质上来说都是数据,因为信息处于动态,我们就将信息或者命令等概念称作流动的数据也就是数据流。在Linux中,程序的数据流有有三种:

    1、输入的数据流——标准输入 STDIN 常用设备:键盘

    2、输出的数据流——标准输出 STDOUT 常用设备:终端

    3、错误输出流——错误输出 STDERR 常用设备:终端

    • 可用于输入的设备:文件(Linux中一切皆文件):

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

    • 用于输出的设备:文件:

    显示器、文件系统上的常规文件、网卡等

  2、输出重定向:

    • >    覆盖输出,目标文件中的原有内容会被消除
    • >>  追加输出,新内容会被追加至目标文件尾部
    • >|      强行覆盖      

    注意:使用>不当会对原有的数据造成很大的影响,所以有时候我们会手动设定关闭>的特性。其命令为:

     # set -C(只对当前shell进程有效)

                  禁止覆盖输出重定向至已存在的文件,此时可使用强制覆盖输出:>|;

     # set +C

                 关闭上述特性

  3、错误输出流重定向

    • 2>(错误覆盖 
    • 2>>(错误追加) 

   1、标准输出和错误输出各自定向至不同位置:

    COMMAND > /path/to/somefile 

    COMMAND 2>/path/to/somefile

    somefile这个文件可以一开始存在,也可以是被新创建的

    2、合并正常输出流和错误输出流为同一个数据流进行重定向:

    (1) &>, &>>

           (2) COMMAND > /path/to/somefile 2>&1

                COMMAND >> /path/to/somefile 2>&1

       特殊设备:/dev/null  :数据黑洞

  4、输入重定向:< / << 

  5、管道

    定义:组合小程序完成重要任务

      连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流

    格式:

      COMMAND1 | COMMAND2 | COMMAND3 | ...

                 注意:最后一个命令是在当前shell进程的子shell进程中执行

  6、tr命令

    转换或删除字符串

    格式:tr [OPTION]... SET1 [SET2]

      把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符

    选项:

      -c或——complerment:取字符集的补集

      -d或——delete:删除所有属于第一字符集的字符

      -s或—squeeze-repeats:把连续重复的字符以单独一个字符表示

  7、tee命令

    一路输入,两路输出

    格式:

      命令1 | tee 文件名| 命令2

      把命令1的STDOUT保存在文件名中,然后管道输入给命令2

8、命令行展开及bash引用

  1、~:自动展开为用户的家目录,或~USERNAME展开为指定的用户的家目录;

  2、{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

                     例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b 

  3、强引用:''

         弱引用:""

         命令引用:``(ESC键下面的那个键)

9、hash特性

  1、hash命令:

    当搜某个可执行程序文件时,只会在第一遍搜寻中去遍寻每个文件路径,搜寻出来之后,系统会暂时把这个可执行程序的文件路径缓存在某个空间中,以便下次直接搜寻;shell搜寻到外部命令的路径结果会缓存至kv(key—value)存储中。

    1、清除缓存:

      如果你搜寻了某个文件之后,在key-value这个格式下,它会缓存在了某个空间中,而当你因为某种原因移动了这个文件的位置后,你再次寻找这个文件时就会出错,这时候就需要清除缓存

    #hash -r 清除所有被记忆的缓存

   2、

      hash:列出

                 hash -d COMMAND:删除

                 hash -r:清空

      hash -l:既可以看到hash表命令的路径,也可以看到它的名字

   3、eg:

    

    上面的hash表会记录下执行命令的次数,以及命令的绝度路径

10、多命令执行控制

  1.并行控制:~]# COMMAND1; COMMAND2; COMMAND3; …

    执行次序:从左到右,

    命令间没有逻辑关系,完成一个之后再进行下一个

     

  2、

2.逻辑控制执行:与&& 、或||、非!

      ==========状态结果做逻辑运算,给多个命令之间建立执行时的逻辑关系==========

      ==========控制语句的执行的逻辑能减少语句的运行==========

        (1)逻辑运算

 1)运算数:真(true, yes, on, 1)

    假(false, no, off, 0)

 2)与:只有两者为真结果才为真,否则都为假

1 && 1 = 1

1 && 0 = 0

0 && 1 = 0

0 && 0 = 0

3)或:一个为真就为真

1 || 1 = 1

1 || 0 = 1

0 || 1 = 1

0 || 0 = 0

4)非:取反

  ! 1 = 0

  ! 0 = 1

       (2)短路法则:

      1)~]# COMMAND1 && COMMAND2

COMMAND1为“假”,则COMMAND2不会再执行;

否则,COMMAND1为“真”,则COMMAND2必须执行;

      2)~]# COMMAND1 || COMMAND2

COMMAND1为“真”,则COMMAND2不会再执行;

否则,COMMAND1为“假”,则COMMAND2必须执行;

 示例:~]# id $username || useradd $username

 11、bash的配置文件

  (1)profile类:为交互式登录的shell进程提供配置

       功用:用于定义环境变量;运行命令或脚本;

        全局/etc/profile /etc/profile.d/*.sh

       用户个人~/.bash_profile

      (2)bashrc类:为非交互式登录的shell进程提供配置

     功用:定义本地变量;定义命令别名;

        全局/etc/bashrc

        用户个人~/.bashrc

    3.bash路径搜索

交互式登录shell进程:

/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录shell进程:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*

    4.定义生效方法

       (1)命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期;

       (2)配置文件定义的特性,只对随后新启动的shell进程有效;

让通过配置文件定义的特性立即生效:

1) 通过命令行重复定义一次;

2) 让shell进程重读配置文件;

~]# source /PATH/FROM/CONF_FILE

~]# .  /PATH/FROM/CONF_FILE

 

 

 

 

 

 

 

 

  

 

posted @ 2017-05-17 16:19  FernLi  阅读(180)  评论(0)    收藏  举报