• echo将文本字符串输出在同一行:echo -n 输出内容
  • 可以使用${variable}格式来引用变量
  • 用户名变量是由不超过20个字符的字母/数字/或下划线组成的文本字符串,区分大小写
  • 反引号允许将shell命令的输出赋值给变量
  • 输入输出重定向(>;<;«;»;)
  • 管道:管道一个最受欢迎的用法是用管道传送命令的结果
  • 数学计算:

    • expr命令,在脚本中使用expr需要使用shell转义字符(反斜杠)
    • 在bash中,为一个变量指定一个数学值时,可以用美元符号(“$(())")和方括号($[operation])
    • 浮点解决方案:内置的bash计算器bc,要退出bash计算器,必须输入quit命令
    • 浮点算术是由scale的内置变量控制,scale变量的默认值是0
    • 在脚本中使用bc,可以使用反引号运行bc命令:variable='echo "options;expression" | bc'
    • 内置输入重定向:(EOF文本字符串表明内置重定向数据的开始和末尾)
    1
    2
    3
    4
    5
    6
    
    variable=`bc<< EOF
    options
    statements
    expressions
    EOF
    `
    
    • 在bash计算器内创建的变量只在bash计算器内有效。
  • linux提供$?特殊变量来保存最后一条命令执行结束的退出状态。

  • Linux退出状态码

    代码 描述 代码 描述
    0 命令成功完成 128 无效的退出命令
    1 通常的未知错误 128+x 时使用Linux信号x的致命错误
    2 误用shell命令 130 使用Ctrl-C终止命令
    126 命令无法执行 255 规范外的退出状态
    127 没有找到命令
  • 默认情况下,shell脚以脚本中最后一条命令的退出状态退出,exit命令允许在脚本结束时,指定一个退出状态(退出状态代码适合0-255范围之内的数)

  • shell脚本中自定义函数的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    
     (1)
     function name {
     commands
     }
     (2)
     name(){
     commands
     }
    
  • if-then语句:

    1
    2
    3
    4
    
    if command(如果命令的退出状态是0,将执行后面的所有命令)
    then
        commands
    fi
    

    ``

  • if-then-else语句:

    1
    2
    3
    4
    5
    6
    
    if command
    then
        commands
    else
        commands
    fi
    
  • 嵌套if语句:

    1
    2
    3
    4
    5
    6
    7
    
    if command1
    then
        commands
    elif command2
    then
        more commands
    fi
    
  • bash的if-then语句不能评估任何条件,只是一条命令的退出状态码。

  • test命令:test conditiontest提供一种检测if-then语句中不同条件的方法。test命令能够评估的3类条件:

    • 数值比较

    • 字符串比较

    • 文件比较

    • 字符串顺序/比较字符串大小,使用test命令有以下问题:

      • 大于和小于符号一定要转义,否则shell会将它们当做重定向符号,将字符串看做文件名。
      • 大于和小于顺序与sort命令中的顺序不同。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      #!/binbash
      #mis-using string comparisons
      a=baseball
      b=hockey
      if [ $a > $b ]
      then
          echo "$a is greater than $b."
      else
          echo "$a is less than $b."
      

    在脚本中单独使用大于号,没有生成大于号,没有生成错误,但是结果不对,脚本将大于号理解为输出重定向,所以创建了一个hockey文件。由于重定向成功完成,所以测试命令返回退出状态码0,if语句认为事情成功完成。

  • 复合条件检查:

    • [ condition1 ]&&[ condition2 ] (与操作)
    • [ condition1 ]||[ condition2 ] (或操作)
  • if-then高级特征:

    • 双圆括号表示数学表达式:(( expression ))
    • 双方括号表示高级字符串处理函数:[[ expression ]] (提供了test命令没有的另一个功能,模式匹配,可以定义字符串值相匹配的正则表达式)
    • 双圆括号命令符号
符号 描述 符号 描述
val++ 后增量 « 逐位左移
val– 后减量 >> 逐位右移
++val 前增量 & 逐位布尔逻辑与
- -val 前减量 || 逐位布尔逻辑或
逻辑否定 && 逻辑与
按位取反 | 逻辑或
** 取幂
  • case命令(执行多条if-then-else命令并在值列表中检查单个变量值的快速方法):case命令以列表导向格式检查单个变量的多个值:

    1
    2
    3
    4
    5
    
    case variable in
    pattern1 | pattern2) commands1;;
    pattern3) commands2;;
    *) default commands;;
    esac
    
  • for命令:

    1
    2
    3
    4
    
    for var in list
    do
        commands
    done
    
  • for命令使用双引号包围值时,shell不会将双引号作为值的一部分。

  • 生成列表中使用的值的另一种方法是使用命令的输出。可以使用反引号字符来执行生成输出的任何命令,然后在for命令中使用命令的输出。

  • 改变字段分隔符(internal field separator,IFS)的特殊环境变量,默认情况下,bash shell将下面字段看做字段分隔符:

    • 空格
    • 制表符
    • 换行符(如果想将IFS的值更改为只识别换行符,只需这样做:IFS=$’\n’)
  • 可以使用for命令自动迭代文件的目录。还可以在同一个for语句中将目录搜索方法和列表方法结合起来。

  • bash中C式for循环的基本格式:for ((variable assignment;condition;iteration precess #可以使用多个变量))

  • while命令:

    1
    2
    3
    4
    
    while test command
    do
        other commands
    done
    
  • while语句行定义允许多条test,只有最后一条测试命令的退出状态是用来决定循环何时停止的。

  • until命令(until命令刚好与while命令相反。until命令需要致制定一条测试命令,这条命令通常产生一个非0的退出状态,可以使用多条测试命令):

    1
    2
    3
    4
    
    until test commands
    do
        other commands
    done
    
  • 嵌套循环

  • 文件数据的循环

    • 使用嵌套循环
    • 更改环境变量IFS
  • 循环控制:

    • break命令
      • 跳出单循环,for,while,until
      • 跳出内循环
      • 跳出外循环break nn表明要跳出的循环级别,默认情况下,n是1,代表跳出当前循环。如果将n设置为2,break命令停止外循环的下一级循环
    • continue命令:在while循环和util循环中可以使用continue命令,当shell执行continue命令时,它跳过余下的命令。
    • continue也允许使用命令行参数指定要继续的循环级别continue n