bash 基础特性之:命令历史

命令历史:shell进程会在会话中保存此前用户提交执行过的命令;

  • 查看历史命令:
    • ~]# history
    • 定制history的功能,可通过环境变量来实现;
    • HISISIZE:shell进程可保留的命令历史条数;
    • HISIFILE:持久保存命令历史的文件 (.bash_history);
    • HISIFILESIZE:命令历史文件的大小;
  • 用法:
-c:清空当前历史命令; 
-a:将历史命令缓冲区中命令写入历史命令文件中; 
-r:将历史命令文件中的命令读入当前历史命令缓冲区; 
-w:将当前历史命令缓冲区命令写入历史命令文件中;
-d:删除指定命令历史条目;
  • 显示最近#条历史命令 (history #);
  • 调用历史列表中的命令 ( ! number);
  • 再次执行上一条命令 (!!);
  • 再一次执行历史列表中最近一个以STRING开头的命令 (!STRING);
  • 调用上一条命令的最后一个参数 (ESC+.、file !$、file alt+.);
  • 控制命令历史的方法
    • 环境变量:HISICONTROL
    • 参数:
      ignorespace:忽略以空白字符开头的命令;
      ignoredups:忽略以空白字符开头的命令;
      ignoreboth:以上两者同时生效;
      echo $HISTCONTROL;
    • 修改变量值
      HISICONTROL=Ignorespace

bash 基础特性之:命令补全

  • 命令补全:
    • shell程序在接收到用户执行命令的请求,分析完成后,最左侧的字符串会被当作命令;
    • 命令查找机制:
    • 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
    • 给定的打头字符串如果能唯一标识某命令程序文件,则直接补全;
    • 不能惟一标识某命令程序文件,再击打一次tab键,会给出列表;
  • 路径补全:
    • 在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件 (tab);
    • 如果能惟一标识,则直接补全。否则,再一次tab给出列表;

bash 基础特性之:命令行展开

  • ~:自动展开为用户的家目录,或指定的用户家目录;
  • {}:可承载一个以逗号分割的路径列表;
  • 例如:

    • mkdir /tmp/{a,b},相当于 mkdir /tmp/a,mkdir /tmp/b;
    • 创建/tmp/sysroot目录下包含以下文件;
    |--bin
    |--etc
        |--sysconfig
                |--network-scripts
    |--sbin
    |--usr
        |--local
                |--bin
        |--sbin
    |--var
        |--cache
    
    • tree命令:

    [options] [directory] 列出树形目录中目录的内容; -l:level 指定显示的层级;

bash 基础特性之:命令的执行状态结果

  • 命令执行的状态结果
    • bash通过状态返回值来输出此结果 (成功:0,失败:1-255);
    • 命令执行完成后,其状态返回值保存于bash的特殊变量中 " $? ";
    • 命令正常执行时,有的还会有命令返回值,其根据命令及其功能不同,结果各不相同;
  • 两种引用命令的执行结果
    • $(COMMAND)
    • `COMMAND`
    • 示例:mkdir $(date +%H-%M-%S)

bash 基础特性之:引用

  • 强引用:' '
  • 弱引用:" "
  • 命令引用: ` `

bash 基础特性之:快捷键

  • Ctrl+a:跳转至命令行行首;
  • Ctrl+e:跳转至命令行行尾;
  • Ctrl+u:删除行首至光标所在处之间的所有字符;
  • Ctrl+k:删除光标所在处至行尾的所有字符;
  • Ctrl+l:清屏(等同clear);

bash 基础特性之:globbing

globbing:文件名通配

  • 星号 *:匹配任意长度的任意字符 (pa*,*pa*,*pa,*p*a*);
  • 问号?:匹配任意单个字符(pa?,??pa,p?a,p?a?);
  • 中括号[]:匹配指定范围内的任意单个字符 ([a-z] [A-Z] [0-9] [a-z0-9]);
  • [^]:匹配指定范围外的任意单个字符([^[:upper:]],[^0-9],[^[:alnum:]]);

bash 基础特性之:命令hash

  • hash命令:
    • -d COMMAND,删除
    • -r 清空hash缓存
  • 执行命令的查找顺序: hash、alias、path;
  • 解释:
    • 把命令的查找结果,缓存在缓存中就叫hash;
    • 什么时候需要清空hash表,hash缓存不正确时;

bash 基础特性之:变量

  • 变量是什么?
    • 简单点,变量其实就是内存中的空间、而后在程序运行过程中给取了一个名字并且能找到这段空间的起始地址,即 变量名+指向的内存空间,然后有名称就能直接引用;
  • 变量赋值:
    • 把要存储的数据存储到变量名所指向的内存空间的过程,就叫做变量赋值;
  • 变量定义之变量的类型:
    • 根据存储数据的变量类型不同,其常用环境变量有以下常见几种...
      本地变量:作用域仅为当前shell进程;
      环境变量:当前shell进程及其子进程;
      局部变量:作用域仅为代码片段,对bash shell 而言函数上下文;
      位置参数变量:当执行脚本的shell进程传递的参数;
      特殊变量:指shell内置和有特殊公用的变量;
  • 变量的定义方式:
    • 本地变量
      赋值:(name=value)
      引用方法:$(name),$name
      变量替换:使用双引号,单引号不会被替换值;
      查看变量:set
      撤销变量:unset name
    • 环境变量
      赋值:export name=value | name=value(export name) | declare -x name=value | name=value
      引用:$(name),$name
      示例:firestname=jerry or declare -x firestname
      注意:bash内嵌了许多环境变量(通常为大写字符),用于定义bash的工作环境;
      (PASH,HISTFILE,HISTSIZE,HSIFLESIZE,HSITCONTROL,SHELL,HOME.UID,PWD,OLDPWD)
      查看当前shell:echo $SHELL
      查看环境变量:export、declare-x 、printenv、env
      撤销环境变量:unset name
  • 把一个变量只读格式:
    • declare -r name
    • readonly name,示例readonly firestname
    • 注意:不支持重新赋值且无法撤销,存活时间为当前shell进程生命周期;

bash 基础特性之:执行多条命令(短路与、短路或)

  • 短路 ‘与,&&’、短路或,‘||’
    ~]# COMMAND1;COMMAND2;COMMAND3...(其命令之间有逻辑关系)
  • 逻辑运算:就是判断真或假
    算数如果为真则表示为(true,yes,on,1)
    算数如果为假则表示为(false,no,off,0)
  • 与、或、非、异或
    • 与,表示乘法,叫短路与运算
      1 && 1 =1
      1 && 0 =0
      0 && 1 =0
      0 && 0 =0
      只有参与运算的两个结果都为真,则为真。否则则为假;
    • 或,表示加法,叫短路或运算
      1 || 1 =1
      1 || 0 =1
      0 || 1 =1
      0 || 0 =0
      只有二者都为零,结果才为零,否则,则为1;
    • 非,表示取反,非假即为真
      ! 1 = 0,! 0 = 1
    • 异或,判断是否不同
      两个数字运算的结果不同则为1,相同则为0;
  • 表示法:

    • 与运算:&&
      ~]# COMMAND1 && COMMAND2,将两个命令的执行结果做状态‘与’运算;
      意义是:可实现控制功能,前面的命令运算结果取决于后面运行的命令;
      COMMAND1为‘假’,则COMMAND2不会再执行,否则COMMAND1为‘真’,则COMMAND2必须执行;
    • 或运算:| |
      ~]# COMMAND1 || COMMAND2,将两个命令的执行结果做状态‘或’运算;
      意义是:可实现控制功能,前面的命令运算结果取决于后面运行的命令;
      COMMAND1为‘真’,则COMMAND2不会执行,否则COMMAND2为‘假’,则COMMAND2必须执行;
      ~]# touch /tmp/test.etc && ls /etc > /tmp/test.etc
    • 注意:命令之间存在‘逻辑关系’,前面的命令结果都会取决于后面的命令;

    done