Bash的基础特性1

1.命令历史  History

 1.1环境变量:

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

     HISTFILE~/.bash_history;

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

     History -d OFFSET

     -c

     History # : 显示历史中最近的#条命令;

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

 1.2调用历史中的命令:

     !#:重复执行执行第#条指令;

     !!:重复执行上一条命令;

     !string:重复执行string这条命令;

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

     !$ | ESC . | Alt+.

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

     环境变量: HISTCONTROL

      Ignoredups 忽略重复的命令,连续且相同方为“重复”

      Ignorespace 忽略所有以空白开头的命令;

      Ignoreboth  Ignorespace   Ignoredups 

3.修改环境变量值的方式: export 变量名=“值”

   变量赋值:把赋值符号后面的数据存储于变量名指向内存空间;

4.命令补全: 

 4.1bash执行命令:

    内部命令:

    外部命令:bash根据PATH环境变量定义的路径,自左至右宰每个路径搜寻以给定命令;

    直接补全: Tab  ,用户给定的字符串只有一条唯一对应的命令;则再次Tab会给出列表;

 4.2.路径补全

   把用户给出的字符串当作路径开头,并在其指定上级目录搜索以指定的字符串开头的文件名;

   如果唯一,直接补全。

   不唯一再次Tab,给出列表

5.命令行展开

    ~ : 展开为用户的主目录;

    ~USERNAME :展开为指定用户的主目录;

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

6.命令的执行状态结果

    成功

    失败

 

   bash 使用特殊变量$?保存最近一条命令的执行状态结果;

      :成功;

      1-255  失败

   程序执行有两类结果:  1〉程序的返回值;

                         2> 程序的执行状态结果

7.命令别名(alias

 1.alias

显示当前shell进程所有可用的命令别名:

 2. alias  NAME=VALUE

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

注意:在命令行中定义的别名,进程当前shell进程有效;如果想永久有效,要定义在配置文件中:

 仅对当前用户: ~/.bashrc

 对有用户:/etc/bashrc 

定义完想要生效需要做一下操作bash进程重新读取配置文件:

 source   /path/to/config_file

    . /path/to/config_file

 (3.撤销别名: unalias

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

Note:如果别名同原命令的名称,则如果要执行原命令,可使用“\COMMAND;

8.glob(globbing)bash中用于实现文件名“通配“用于文件名或目录名的匹配,不要与grep混淆

  通配符 :  *, ?,[]

(1) *

任意长度的任意字符

 a*b:

    aab,  ab, a1122b

(2) . ? 

任意单个字符

  a?b

  a1b.aab 

(3)   []

  匹配制定范围内的任意单个字符

      [abc]   a,b,c   中选一个

      [0-9]  :  0-9任意其中一个数字

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

      [A-Z]  : 大写

   (4)  [^]

          匹配制定范围之外的任意单个字符

专用字符集合:

  [:digit:]  : 任意数字,相当于[0-9]

  [:alnum:] : 任意数字或字母

  [:lower:] : 任意小写字母,相当于[^A-Z]

  [:upper:] : 任意大写字母

  [:alpha:] : 任意大小写字母

  [:alnum:] : 任意字母或数字

  [:space:] : 空白

  [:punct:] : 标点符号

练习1

1.显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录:

 [root@chang ~]# ls -d /var/l*[0-9]*[[:lower:]]

2.显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录:

   [root@chang ~]# ls -d /etc/^[0-9]*[^0-9]

   3.显示/etc目录下,以非字母开头,后面跟了一个字母及其他任意长度任意字符的文件或目录:

   [root@chang ~]# ls /etc/[^[:alpha:]][[:alpha:]]*

   4.复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/chang目录下:

    [root@chang ~]# cp -a  /etc/m*[^0-9]  /tmp/chang

  5.复制/etc目录次啊,所有以.d结尾的文件或目录至/tmp/chang.com目录中:

    [root@chang ~]# cp -a /etc/*.d  /tmp/chang.com

  6.复制/etc目录次啊,所有以.conf结尾,且以mnrp开头的文件或目录至/tmp/cc目录中:

    [root@chang ~]# cp -a /etc/[mnrp]*.conf /tmp/cc

9.bash 的快捷键:

   ctrl+l:  清屏,相当于clear

   ctrl+a 跳转至命令开始处

   ctrl+e : 跳转至命令结尾处

   ctrl+c : 取消命令的执行

   ctrl+u :  删除命令行首至光标所在处的所有内容;

   ctrl+k : 删除光标所在处至命令行尾部的所有内容;

10.bashI/O重定向及管道

  程序: 指令+数据

读入数据: input

输出数据: output

   打开的文件都有一个fd: file descrtptor (文件描述符)

   标准输入:keyboard , 0

   标准输出:monitor,   1

   标准错误输出: monitor,  2

11.I/O重定向: 改变标准位置

  11.1输出冲定向: COMMAND > NEW_POS, COMMAND >> MEW_POS

  >: 覆盖重定向,目标文的原有无内容会被清除;

  >>: 追加重定向,新内容会追加至目标文件尾部;

  11.2 #  set  C: 禁止将内容覆盖输出至已有文件中;(只对当前进程有效)

  强制覆盖: >|

  #  set  +C

  11.3 1) 2>: 覆盖重定向错误输出数据流:

            2>>: 追加重定向错误输出流;

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

   COMMAND >  /PATH/to/file.out   2> /path/to/error.out

  11.4合并标准输出和错误输出同一个数据流进行重定向: 

    &> : 覆盖重定向       &>> :追加重定向

    COMMAND > /path/to/file.out 2> &1

    COMMAND >> /path/to/file.out 2>> &1

 11.5输入重定向: <

  显式使用:tr

  隐式使用:.

12.Tr命令:转换或删除字符

     tr [option ] SET1 [SET2]

HERE Documentation :   <<EOF :end  off  file

#  cat  <<EOF

#  cat   > /path/to/somefile  <<EOF

管道:

   COMMAND1  |  COMMAND2  |COMMAND3 

Note : 最后一个命令会在当前shell进程的子进程中执行Tee命令:

   tee [OPTION]... [FILE]...

练习2

  1./etc/passwd文件中的前5行内容转换为大写保存至/tmp/passwd.out文件中:

   [root@chang ~]# tail -n 2 /etc/passwd | tr'a-z' 'A-Z' >/tmp/passwd.out

  2.将登录至当前用户信息的后3位的信息转换为大写后保存至/tmp/who.out中:

   [root@chang ~]# who | tail -n 3 | tr 'a-z' 'A-Z' >/tmp/who.out