美文网首页
BASH脚本语法汇集

BASH脚本语法汇集

作者: 羽风之歌 | 来源:发表于2015-04-02 10:35 被阅读91次

    特殊字符

    #        注释.
    ;        命令分隔符,可以在同一行上写两个或两个以上的命令.
    ;;        终止case选项.
    .        "点"命令等价于source命令.
             "点"作为文件名的一部分. 如果点放在文件名的开头的话, 那么这个文件将会成为隐藏文件,
             "点"字符匹配. "点"用来匹配任何的单个字符.
    ""       部分引用[双引号, 即"]. "STRING"将会阻止(解释)STRING中大部分特殊的字符.
    ''       全引用[单引号, 即']. 'STRING'将会阻止STRING中所有特殊字符的解释. 这是一种比使用"更强烈的形式.
    ,        逗号操作符. 逗号操作符链接了一系列的算术操作. 虽然里边所有的内容都被运行了,但只有最后一项被返回.
    \        转义符[反斜线, 即\]. 一种对单字符的引用机制.
    /        文件名路径分隔符[斜线, 即/],也可以用来作为除法算术操作符.
    ``       命令替换. 已逐渐被$()替代,后者更灵活,如可以嵌套等
    :        空命令[冒号, 即:]. 也可以被认为与shell的内建命令true作用相同.
    !        取反操作符[叹号, 即!].
    *        通配符[星号, 即*]. *可以用来做文件名匹配,也可以用在正则表达式中, 用来匹配任意个数(包含0个)的字符.
             算术操作符. 在算术操作符的上下文中, *号表示乘法运算.
             如果要做求幂运算, 使用**, 这是求幂操作符.
    ?        测试操作符. 在一个特定的表达式中, ?用来测试一个条件的结果.
             在一个双括号结构中, ?就是C语言的三元操作符.
             在参数替换表达式中, ?用来测试一个变量是否被set了.
             通配符. ?在通配(globbing)中, 用来做匹配单个字符的"通配符".
    $        变量替换(引用变量的内容).
             行结束符. 在正则表达式中, "$"表示行结束符.
    ${}      参数替换.
    $*       位置参数
    $@       同上.
    $?       退出状态码变量. $?变量保存了一个命令, 一个函数, 或者是脚本本身的退出状态码.
    $$       进程ID变量. 这个$$变量保存了它所在脚本的进程ID.
    ()       命令组.
    {}       代码块,又被称为内部组, 这个结构事实上创建了一个匿名函数(一个没有名字的函数).
    []       条件测试.数组元素.用作正则表达式的一部分, 方括号描述一个匹配的字符范围.
    [[]]     测试.
    (())     整数扩展.
    >
    &>
    >&
    >>
    <
    <>       重定向.
    <<       用在here document中的重定向.http://doc.linuxpk.com/doc/abs/here-docs.html#HEREDOCREF
    <<<      用在here string中的重定向.
    <
    >        ASCII comparison.
    \<
    \>       正则表达式中的单词边界.
    |        管道.
    >|       强制重定向(即使设置了noclobber选项 -- 就是-C选项). 这将强制的覆盖一个现存文件.
    ||       或-逻辑操作.
    &        后台运行命令.
    &&       与-逻辑操作.
    -        选项, 前缀.
             用于重定向stdin或stdout[破折号, 即-].
             先前的工作目录.
             减号. 减号属于算术操作.
    =        等号. 赋值操作,"="也用来做字符串比较操作.
    +        加号. 加法算术操作.某些命令内建命令使用+来打开特定的选项, 用-来禁用这些特定的选项.
    %        取模. %也是一种模式匹配操作. 在BASH中,%number表示将后台编号为number的任务调度到前台执行。
    ~        home目录[波浪号, 即~].
    ~+       当前工作目录. 相当于$PWD内部变量.
    ~-       先前的工作目录. 相当于$OLDPWD内部变量.
    =~       正则表达式匹配. 这个操作将会在version 3版本的Bash部分进行讲解.
    ^        行首. 在正则表达式中, "^"表示定位到文本行的行首.
    

    文件测试

    -e       文件存在.
    -f       表示这个文件是一个一般文件.
    -d       表示这是一个目录.
    -b       表示这是一个块设备.
    -c       表示这是一个字符设备.
    -p       这个文件是一个管道
    -s       文件大小不为零.
    -L       这是一个符号链接
    -S       表示这是一个socket
    -t       文件(描述符)被关联到一个终端设备上.
             这个测试选项一般被用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否来自于一个终端.
    -r       文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)
    -w       文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)
    -x       文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限)
    -g       set-group-id(sgid)标记被设置到文件或目录上
    -u       set-user-id (suid)标记被设置到文件上
    -k       设置粘贴位
    -O       判断你是否是文件的拥有者
    -G       文件的group-id是否与你的相同
    -N       从文件上一次被读取到现在为止, 文件是否被修改过
    !        "非" -- 反转上边所有测试的结果(如果没给出条件, 那么返回真).
    

    比较操作

    • 文件比较

      f1 -nt f2
          文件f1比文件f2新
      f1 -ot f2
          文件f1比文件f2旧
      f1 -ef f2
          文件f1和文件f2是相同文件的硬链接
      
    • 整数比较

      -eq        等于
      -ne        不等于
      -gt        大于
      -ge        大于等于
      -lt        小于
      -le        小于等于
      <          小于
      <=         小于等于
      >          大于
      >=         大于等于
      
    • 字符串比较

      =          等于
      ==         等于
      !=         不等号
      <          小于, 按照ASCII字符进行排序
      >          大于, 按照ASCII字符进行排序
      -z         字符串为"null", 意思就是字符串长度为零
      -n         字符串不为"null".
      -l         字符串长度
      
    • 逻辑操作

      -a         逻辑与
      -o         逻辑或
      !          逻辑非
      

    参数替换

    • 参数扩展

      ${parameter}        与$parameter相同, 在某些上下文中, ${parameter}很少会产生混淆.
      ${parameter-default}    如果变量parameter没声明, 那么就使用默认值.
      ${parameter:-default}    如果变量parameter没设置, 那么就使用默认值.
      ${parameter=default}    如果变量parameter没声明, 那么就把它的值设为default.
      ${parameter:=default}    如果变量parameter没设置, 那么就把它的值设为default.
      ${parameter+value}    如果变量parameter被声明了, 那么就使用value, 否则就使用null字符串.
      ${parameter:+value}    如果变量parameter被设置了, 那么就使用value, 否则就使用null字符串.
      ${parameter?err_msg}    如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息.
      ${parameter:?err_msg}    如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息.
      
    • 子串删除

      ${#var}            字符串长度(变量$var的字符个数). 对于array来说, ${#array}表示的是数组中第一个元素的长度.
      ${var#Pattern}        从变量$var的开头删除最短匹配$Pattern的子串.
      ${var##Pattern}        从变量$var的开头删除最长匹配$Pattern的子串.
      ${var%Pattern}        从变量$var的结尾删除最短匹配$Pattern的子串.
      ${var%%Pattern}        从变量$var的结尾删除最长匹配$Pattern的子串.
      
    • 子串替换

      ${var:pos}        变量var从位置pos开始扩展(译者注: 也就是pos之前的字符都丢弃).
      ${var:pos:len}        变量var从位置pos开始, 并扩展len个字符.
      ${var/Pat/Rep}        使用Rep来替换变量var中第一个匹配Pat的字符串.
      ${var//Pat/Rep}        使用Rep来替换变量var中的所有匹配Pat的字符串.
      ${var/#Pat/Rep}        如果变量var的前缀匹配Pat, 那么就使用Rep来替换匹配到Pat的字符串.
      ${var/%Pat/Rep}        如果变量var的后缀匹配Pat, 那么就使用Rep来替换匹配到Pat的字符串.
      
      ${!varprefix*}
      ${!varprefix@}        匹配所有之前声明过的, 并且以varprefix开头的变量.
      

    进程替换

    >(command)
    <(command)
    

    变量定义

    declare用法

    -r        只读
    -i         整型
    -a         数组
    -f         函数
    -x export    这句将会声明一个变量, 并作为这个脚本的环境变量被导出.
    -x var=$value    允许在声明变量类型的同时给变量赋值.
    

    控制结构

    • if结构

      if  command
      then
              command
      elif  command
      then
              command
      else
              command
      fi
      例:
      var=70;
      if (($var<60))
      then
          echo "too bad"
      elif (($var>90))
      then
          echo "very good"
      else
          echo "OK"
      fi
      
    • case结构

      case variable in
      value1)
              command1
              ;;
      value2)
              command2
              ;;
      *)
              command3
              ;;
      esac
      例:
      cat << ENDIT
              1)one
              2)two
      ENDIT
      read choice;
      case "$choice" in
      1)
              echo "one"
              ;;
      2)
              echo "two"
              ;;
      *)
              echo "Error"
              ;;
      esac
      
    • for结构

      for variable in world_list
      do
              command
      done
      例:
      for line in ~/*
      do
              echo $line;
      done
      
      for (( i=$loop; i != 0; i-- )); do
              echo "hello"
      done
      
    • while结构

      while command
      do
              command
      done
      例:
      var=1
      while ((var<=30))
      do
              echo $var
              let "var=var+1"
      done
      
    • 函数使用

      function() {
        ........
      }
      
      $1-9  1-9个参数
      $#    参数的数量
      $@    所有参数,但是所有参数都是一个字符串
      $*    所有参数,但每个参数都是一个单独元素
      
    • 运算命令
      loop=$(((31-16)/8))
      echo $loop
      用$(())命令可以进行数学计算

    • 重定向
      一般情况下重定向命令只会把内容重定向到一个地方,比如要么到标准输出,要么到文件。使用tee重定向可以将标准输出同时重定向到标准输出和文件中,但是不能得到标准错误输出的内容。下面的方式可以在标准输出上看到内容,同时将标准输出和错误输出都记录到文件中:

      #!/bin/sh
      cmd="/builds/tools/cnrdmk78.sh jsr > /dev/stdout 2>&1"
      eval $cmd | tee aaa
      

      第一句将标准输出和错误输出全部重新放到标准输出里面,这样就可以在屏幕上看到输出的内容。这里有2个需要注意的地方,首先是整个命令要放进一个变量里(因为要重定向2次),其次是不能用 >& 的方式而必须分开来写。

      第二句则执行上面的重定向命令,然后将输出放进aaa文件

    相关文章

      网友评论

          本文标题:BASH脚本语法汇集

          本文链接:https://www.haomeiwen.com/subject/dqboxttx.html