Shell
Shell
  概述
    交互模式
      命令行
    非交互模式
      sh 脚本
  模式
    交互模式
      命令行
    非交互模式
      sh 脚本
  注释
    以#开头，到行尾结束。
  变量
    局部变量
      仅在某个脚本内部有效的变量。不能被其他的程序和脚本访问。
      用=声明，用$访问
      local 关键字声明属于某个函数的局部变量，变量会在函数结束时消失。
    环境变量
      export 关键字声明对当前 shell 会话内所有的程序或脚本都可见的变量。
    位置参数变量
      位置参数是在调用一个函数并传给它参数时创建的变量。
  数组
    创建数组
      array[0] = val
array[1] = val
array[2] = val
      array=([2]=val [0]=val [1]=val)
      array=(val val val)
    访问数组元素
      ${array[i]}
      ${array[@]:0:2}
    添加元素
      colors=(Orange "${colors[@]}" Banana Cherry)
    删除元素
      unset colors[0]
  运算符
    算数运算符
      +
        加法
        expr $a + $b 结果为 30。
      -
        减法
        expr $a - $b 结果为 -10。
      *
        乘法
        expr $a \* $b 结果为 200。
      /
        除法
        expr $b / $a 结果为 2。
      %
        取余
        expr $b % $a 结果为 0。
      =
        赋值
        a=$b 将把变量 b 的值赋给 a。
      ==
        相等。用于比较两个数字，相同则返回 true。
        [ a == b ] 返回 false。
      !=
        不相等。用于比较两个数字，不相同则返回 true。
        [ a != b ] 返回 true。
    关系运算符
      -eq
        检测两个数是否相等，相等返回 true。
        [ a -eq b ] 返回 false。
      -ne
        检测两个数是否相等，不相等返回 true。
        [ a -ne b ] 返回 true。
      -gt
        检测左边的数是否大于右边的，如果是，则返回 true。
        [ a -gt b ] 返回 false。
      -lt
        检测左边的数是否小于右边的，如果是，则返回 true。
        [ a -lt b ] 返回 true。
      -ge
        检测左边的数是否大于等于右边的，如果是，则返回 true。
        [ a -ge b ] 返回 false。
      -le
        检测左边的数是否小于等于右边的，如果是，则返回 true。
        [ a -le b ] 返回 true。
    布尔运算符
      !
        非运算，表达式为 true 则返回 false，否则返回 true。
        [ ! false ] 返回 true。
      -o
        或运算，有一个表达式为 true 则返回 true。
        [ a -lt 20 -o b -gt 100 ] 返回 true。
      -a
        与运算，两个表达式都为 true 才返回 true。
        [ a -lt 20 -a b -gt 100 ] 返回 false。
    逻辑运算符
      &&
        逻辑的 AND
        [[ $a -lt 100 && $b -gt 100 ]] 返回 false
      ||
        逻辑的 OR
        [[ $a -lt 100 || $b -gt 100 ]] 返回 true
    字符串运算符
      =
        检测两个字符串是否相等，相等返回 true。
        [ a = b ] 返回 false。
      !=
        检测两个字符串是否相等，不相等返回 true。
        [ a != b ] 返回 true。
      -z
        检测字符串长度是否为0，为0返回 true。
        [ -z $a ] 返回 false。
      -n
        检测字符串长度是否为0，不为0返回 true。
        [ -n $a ] 返回 true。
      str
        检测字符串是否为空，不为空返回 true。
        [ $a ] 返回 true。
    文件测试运算符
      -b file
        检测文件是否是块设备文件，如果是，则返回 true。
        [ -b $file ] 返回 false。
      -c file
        检测文件是否是字符设备文件，如果是，则返回 true。
        [ -c $file ] 返回 false。
      -d file
        检测文件是否是目录，如果是，则返回 true。
        [ -d $file ] 返回 false。
      -f file
        检测文件是否是普通文件（既不是目录，也不是设备文件），如果是，则返回 true。
        [ -f $file ] 返回 true。
      -g file
        检测文件是否设置了 SGID 位，如果是，则返回 true。
        [ -g $file ] 返回 false。
      -k file
        检测文件是否设置了粘着位(Sticky Bit)，如果是，则返回 true。
        [ -k $file ] 返回 false。
      -p file
        检测文件是否是有名管道，如果是，则返回 true。
        [ -p $file ] 返回 false。
      -u file
        检测文件是否设置了 SUID 位，如果是，则返回 true。
        [ -u $file ] 返回 false。
      -r file
        检测文件是否可读，如果是，则返回 true。
        [ -r $file ] 返回 true。
      -w file
        检测文件是否可写，如果是，则返回 true。
        [ -w $file ] 返回 true。
      -x file
        检测文件是否可执行，如果是，则返回 true。
        [ -x $file ] 返回 true。
      -s file
        检测文件是否为空（文件大小是否大于0），不为空返回 true。
        [ -s $file ] 返回 true。
      -e file
        检测文件（包括目录）是否存在，如果是，则返回 true。
        [ -e $file ] 返回 true。
  语句
    条件语句
      if...else if...else
      case
    循环语句
      for
      while
      until
      select
      break
      continue
  函数
    函数参数
      $#
        传递到脚本的参数个数
      $*
        以一个单字符串显示所有向脚本传递的参数
      $$
        脚本运行的当前进程ID号
      $!
        后台运行的最后一个进程的ID号
      $@
        与$*相同，但是使用时加引号，并在引号中返回每个参数。
      $-
        显示Shell使用的当前选项，与set命令功能相同。
      $?
        显示最后命令的退出状态。0表示没有错误，其他任何值表明有错误。