美文网首页
1-23-条件测试语句和if流程控制语句的使用

1-23-条件测试语句和if流程控制语句的使用

作者: 秋的懵懂 | 来源:发表于2018-06-17 16:26 被阅读0次

    时间:2018-06-16 姓名:魏文应


    一、变量测试语句

    test测试命令

    使用test命令,可以进行变量的测试。如果结果是对的,也叫结果为真,用$?=0表示,反之为假,用$?=1表示。

    参数 说明 示例
    -e 文件名 文件是否存在,存在为真 test -e my_test.txt
    -r 文件名 文件是否可读,可读为真 test -r my_test.txt
    -w 文件名 文件是否可写,可写为真 test -w my_test.txt
    -x 文件名 文件是否可执行,可执行为真 test -x my_test.txt
    -s 文件名 文件是否有字符,有为真 test -s my_test.txt
    -d 文件名 文件是否为目录,是为真 test -d my_test.txt
    -f 文件名 文件是否为普通文件,是为真 test -f my_test.txt
    -c 文件名 文件是否为字符型特殊文件,是为真 test -c my_test.txt
    -b 文件名 文件是否为块特殊文件,是为真 test -b my_test.txt

    注意:文件必须存在,不存在都为假,$?=1。 比如:

    # 测试文件是否存在
    test -e my_test.txt
    # 打印测试结果
    echo $?
    

    数值大小比较

    参数 说明
    -eq 等于
    -ne 不等于
    -gt 大于
    -ge 大于等于
    -lt 小于
    -le 小于等于

    比如:

    # 判断5和4是否相等
    test  5 -eq 4
    # 打印测试结果
    echo $?
    

    字符串比较

    参数 说明
    = 等于则为真
    != 不相等则为真
    -z 字符串 字符串的长度为零则为真
    -n 字符串 字符串的长度不为零则为真

    比如:

    str1=abc
    str2=abcd
    
    test $str1 = $str2
    echo $?
    
    test $str1 == $str2
    echo $?
    
    test $str1 != $str2
    echo $?
    
    test -z $str1
    echo $?
    

    test测试语句另一种常用的使用方法

    我们使用 [ ] 中括号来表示test这个命令,比如 [ -d /etc ] 来判断 /etc 是否是一个目录,相当于 test -d /etc 这个命令。使用 [ ] 中括号,在数值比较时,我们可以使用正常的数学符号来比较数值大小,也可以使用 -eq、-ne、-gt 等字符。

    字符表示 符号替代表示
    -eq == 等于
    -ne != 不等于
    -gt > 大于
    -lt < 小于

    在使用 [ ] 替代test命令是,我们要注意一下几点:

    • 中括号开始和结束 需要带空格,比如:[ -d /etc ] 是正确的,[-d /etc] 是不正确的。
    • 比较符两边要加空格,比如:[ 9 == 4 ] 是正确的, [ 9==4 ] 是不正确的。
    • 大于号和小于号要加转义字符(\),比如: [ 9 \< 4 ] 是正确的,[ 9 < 4 ] 是不正确的。如果不用转义字符,可以这样使用:[[ 9 < 4 ]]

    我们需要了解以下特性:

    • [ ]表达式中,常见的> 、<需要加转义字符,表示字符串大小比较。

    • [[ ]] 运算符只是 [ ]运算符的扩充, 能够支持< 、>符号运算,而不需要转义符。里面支持逻辑运算符 || 、 && 不再使用 -a 、-o 。

    • [[ ]] 能用正则,而 [ ] 不行,比如:

      # 这个打印false,*.html就是字面上的意思,而不是通配符*
      [ "a.html" == *.html ] && echo true || echo false
      
      # 这个打印ture,*是通配符
      [[ "a.html" == *.html ]] && echo true || echo false  
      
      # 用引号引起来,*也不是通配符,只是字面上的意思
      [[ "a.html" == "*.html" ]] && echo true || echo false
      

    逻辑与(&&)和逻辑或(||)

    逻辑与(&&): 逻辑与,可以用 -a 表示(在[[ ]] 这中有双中括号的时候,不能用 -a 表示 &&)。比如:[ -f /etc/passwd ] && [ -w /etc/passwd ]

    逻辑或(||): 可以用 -o 表示(在[[ ]] 这中有双中括号的时候,不能用 -o 表示 ||)。比如:[ -f /etc/passwd ] || [ -w /etc/passwd ]

    在条件判断中,使用逻辑与,可以使用下面三种写法:

    if [ 条件判断一 ] && [ 条件判断二 ]; then
        命令一
    fi
    
    if [[ 条件判断一 && 条件判断二 ]]; then
        命令一
    fi
    
    if [ 条件判断一 -a 条件判断二 ]; then
        命令一
    fi
    

    逻辑与和逻辑或,还有下面的用途,比如

    [ 1 -lt 2 -a 5 > 3 ] && echo true || echo false
    

    上面语句,如果[ 1 -lt 2 -a 5 > 3 ]为真时,执行echo true,如果为假时,执行echo false

    二、流程控制--if语句

    单分支if语句

    语法格式:

    if  条件1  ; then
        命令1
    fi
    

    比如:

    #!/bin/bash
    
    if [ $USER != root ]
    then
            echo "error: not root user, permission demain."
            exit 127            # 给它一个退出码
    fi
    

    也可以将then和if放在同一行:

    #!/bin/bash
    
    if [ $USER != root ]; then
            echo "error: not root user, permission demain."
            exit 127            # 给它一个退出码
    fi
    

    双分支if语句

    语法格式:

    if  条件1  ; then
        命令1
    else
        命令2
    fi
    

    比如,写一个ping测试IP的脚本,看一下是否能够ping通:

    #!/bin/bash
    
    # 在类Unix系统中,/dev/null,或称空设备,
    # 是一个特殊的设备文件,它丢弃一切写入其
    # 中的数据(但报告写入操作成功),读取它
    # 则会立即得到一个EOF。
    
    ping -c 3 -i 0.2 $1 > /dev/null
    
    if [ $? -eq 0 ]; then
            echo "HOST $1 is up"
    else
            echo "HOST $1 is down"
    fi
    

    多分支if语句

    语法格式:

    if  条件1  ; then
        命令1
    elif  条件2  ; then
        命令2:
    elif  条件3  ; then
        命令3
    else
        命令n
    fi
    

    比如:

    #!/bin/bash
    
    m=man
    w=woman
    
    read -p "请输入你的性别:" sex
    
    if [ $sex == $m ]; then
            echo "这是男人。"
    elif [ $sex == $w ]; then
            echo "这是女人。"
    else
            echo "输入错误。"
    fi
    

    相关文章

      网友评论

          本文标题:1-23-条件测试语句和if流程控制语句的使用

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