bash脚本基础入门之条件测试

    在运行bash命令的时候,无论成功还是失败都会返回为用户返回一个执行的结果,通常把他叫做退出状态码,每当我们运行命令的时候,退出状态码都会被记录在$?变量中,在命令行echo $?可以查看命令的执行结果,成功的值为0,失败的值为1-255之间的某个值。

wKioL1R8WMKBnOClAAE8H445D3Y971.jpg

    注:在shell脚本中,退出状态码记录的是脚本最后一条命令,为方便检查脚本错误,可以使用exit #自定义退出状态码。

    shell结构化命令中,如if...then语句、while...do...done语句等的CONDITION条件都是以命令的退出状态码,作为下一条命令是否执行的依据。它们无法测试跟命令的退出状态码无关的条件,例如我们要判断3是否大于5,是没法直接用3>5作为测试条件输出正确结果的,因此我们就需要借助于其它条件测试工具。

wKiom1SCb2HT7t9DAAEOwkA1Dxs921.jpg

    bash/shell提供了几个好用的条件测试工具,可用于测试跟命令的退出状态码无关的条件,真为0,假为非0值。(注:与C语言中的条件真假不同,切记!)

    条件测试工具有:test EXPRESSION 、[ EXPRESSION ]或` EXPRESSION `(注:EXPRESSION两边都要有空格,否则shell视为语法错误)、命令COMMAND(COMMAND不能放在[]中,在[]内的命令要使用``引用)。

    test、[]、[[]]可以用于比较(测试)三类条件:整数比较、字符串比较、文件比较。不同的测试条件,运算符尽不不相同

    整数比较运算符:

wKiom1R8XRKzsL1zAAGGHGPqui8288.jpg

wKioL1SCcoDxRJhpAADiEP-8dxU155.jpg

wKioL1R8XpSy9FldAAQR5msyl2I795.jpg

wKiom1R8XnSi-GUHAAOiRk-EPXQ508.jpg

    字符串比较运算符:

wKioL1R8Xgyy9UNkAAFcXdPHnoc752.jpg

wKioL1R8X0TwrdVIAAMtOI-1gqM608.jpg

wKiom1R8YAbgdwU7AAK6DqsblYc642.jpg

    文件测试运算符:

wKioL1SCeSOzI-qYAATYPZwH7pY899.jpg

wKioL1SCe3myazFuAAOeLwLvn_8851.jpg

wKiom1SCev6ChpHVAAO0D6_uiTs564.jpg

    逻辑操作运算符:

wKioL1SCfbCQUyTMAAFLLE9o0w0817.jpg

wKioL1SCfpewWDfXAAOdsJRYP7g407.jpg

wKiom1SCfhLBSH3VAAlbyeF57no407.jpg

wKiom1SCfqqRg_-6AAbXUc4zBjM971.jpg

    在shell的结构化命令中,如果CONDITION条件是命令时,要先理清是要用命令的运行结果作为测试条件还是命令的退出状态码作为测试条件。若使用命令运行的结果作为测试条件(实际上,这种情况经常被使用),那么应要使用命令引用,然后在用比较操作符。    

#!/bin/bash
# 传递一个参数给脚本,此参数为用户名;
# 如果用户存在,则执行如下任务
# 如果用户的id号小于500,显示其为管理员或系统用户;
# 否则,显示其为普通用户;
if id $1 &> /dev/null; then
#要使用id -u的运行结果跟500做比较,因此先命令引用再比较操作符
        if [ "`id -u $1`" -lt 500 ]; then
                echo "$1为管理员或系统用户"
        else
                echo "$1为普通用户"
        fi

wKiom1SCrfXw-X5vAAC1mKWYycs070.jpg

    如果要使用命令的退出状态码作为测试条件,则要先运行命令再使用命令状态码,有两种表现形式:一种是

  

  if CMD; then
      ...
  fi

另一种是

CMD 
if [ $? -eq 0 ]; then
    ...
fi

    

wKiom1SCsNOjKZcVAAMugzrXiF8742.jpg

    shell中允许用户使用&&、||、!组合测试条件,进行条件测试。这三个操作符既可以用于连接[]与[],也可以用于连接命令,相当于结构化命令的使用

#!/bin/bash
#用ping命令测试172.16.100.X内的所有主机
#将在线的主机输出出来
for i in {1..255} 
do
        ping -c1 -w1 172.16.100.$i &> /dev/null
        [[ $? -eq 0 ]] && echo "172.16.100.$i 在线"
done



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章