• Shell编程-05-Shell中条件测试与比较


    Shell脚本条件测试

        在Shell脚本中各种条件结构和流程控制结构中会存在各种判断比较,然后根据不同的判断结果执行不同的操作或命令,返回的结果通常为真或假。常见的条件测试如下所示:

    • 条件测试-1
    test <测试表达式>
    

    利用test命令进行条件测试表达式,test命令和表达式中间至少有一个空格

    • 条件测试-2
    [ <测试表达式> ]
    

    利用[]进行条件测试的方法,表达式与[]前后均需要有至少一个空格

    • 条件测试-3
    [[ <测试表达式> ]]
    

    利用[ [ ] ]进行条件测试的方法,表达式与[ [ ] ]前后均需要有至少一个空格

    • 条件测试-4
    ((<测试表达式>))
    

    利用(())进行条件测试的方法,表达式与(())前后不需要有空格,一般用于if语句

    以上几种用法的注意事项如下所示:

    • 1、test命令和[]功能是等价的
    • 2、[[]]是test命令的扩展
    • 3、(())常用于计算
    • 4、[[]]可以使用通配符进行模式匹配
    • 5、&&、||、<、>等操作符可以用在[[]],但不能用在[]中,在[]中一般用-a、-o、-gt、-lt等进行代替

    test条件测试

      其基本语法如下所示:

    test <测试表达式>
    

      示例如下所示:

    [root@localhost Test]# test -f para.sh && echo true || echo false
    true
    [root@localhost Test]# test -f para && echo true || echo false
    false
    
    

    以上命令用于测试文件是否为普通文件或文件是否存在,如果是则输出true,否则输出false

    []条件测试

      其基本语法如下所示:

    [ <测试表达式> ]
    

      []与test功能是等价的,即test的所有判断选项均可以直接在[]中使用。示例如下所示:

    [root@localhost Test]# [ -f para.sh ] && echo true || echo false
    true
    [root@localhost Test]# [ -f para ] && echo true || echo false
    false
    

    以上注意表达式与[]间的空格

    [[]]条件测试

      其基本语法如下所示:

    [[ <测试表达式> ]]
    

      其示例如下所示:

    [root@localhost Test]# [[ -f para.sh ]] && echo true || echo false
    true
    [root@localhost Test]# [[ -f para ]] && echo true || echo false
    false
    

    以上注意表达式与[[]]间的空格

    - 1、以上几种用法,推荐采用[]写法,其他三种了解即可
    - 2、如需查看更详细的用法,可以使用man 进行查看
    

    Shell文件测试

    常用文件测试表达式

      如果在编写脚本时需要操作一个对象,需要先对对象进行测试,在满足条件后才会进行相应的操作或命令,从而避免程序出错和资源浪费。操作的对象通常为文件、字符串和数字等,常见的文件测试表达式如下所示:

    文件操作符 英文含义 含义
    -b FILE block 文件存在且为块设备文件则为真
    -c FILE character 文件存在且为字符设备文件则为真
    -d FILE directory 文件夹存在则为真
    -f FILE file 文件存在且为普通文件则为真
    -e FILE exist 文件存在即为真,不区分文件或文件夹
    -L FILE symbolic link 文件存在且为链接文件则为真
    -O FILE owner 文件存在且属主有有效的UID则为真
    -G FILE group 文件存在且属组有有效的GID则为真
    -r FILE read 文件存在且具备可读权限则为真
    -s FILE size 文件存在且文件大小大于0则为真
    -w FILE write 文件存在且具备可写权限则为真
    -x FILE executable 文件存在且具备可执行权限则为真
    FILE1 -ef FILE2 equal FILE1和FILE2拥有同样的设备和inode number则为真
    FILE1 -nt FILE2 new than FILE1的修改日期比FILE2新则为真
    FILE1 -ot FILE2 older than FILE1的修改日期比FILE2旧则为真

    以上更详细信息可使用命令man test进行查看。

    文件测试表达式示例

    [root@localhost Test]# [ -d ~/Test ] && echo true || echo false
    true      # 判断文件是否为文件夹
    [root@localhost Test]# [ -e ~/Test/eval.sh ] && echo true || echo false
    true      # 判断文件是否存在
    [root@localhost Test]# [ -e ~/Test/ ] && echo true || echo false
    true      # 判断文件是否存在
    [root@localhost Test]# [ -O ~/Test/ ] && echo true || echo false
    true      # 判断文件是否存在且套上有效的UID
    [root@localhost Test]# [ -G ~/Test/ ] && echo true || echo false
    true      # 判断文件是否存在且套上有效的GID
    [root@localhost Test]# ll -d ~/Test/
    drwxr-xr-x 2 root root 123 11月  1 17:47 /root/Test/ # 显示文件信息
    [root@localhost Test]# [ -r ~/Test/ ] && echo true || echo false
    true      # 判断文件是否存在及可读权限
    [root@localhost Test]# [ -w ~/Test/ ] && echo true || echo false
    true      # 判断文件是否存在及可写权限
    [root@localhost Test]# [ -x ~/Test/ ] && echo true || echo false
    true      # 判断文件是否存在及可执行权限
    [root@localhost Test]# stat eval.sh exec.sh
      文件:"eval.sh"
      大小:68        	块:8          IO 块:4096   普通文件
    设备:802h/2050d	Inode:21590       硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    最近访问:2018-11-01 17:32:31.559464328 +0800
    最近更改:2018-11-01 17:32:19.712464490 +0800
    最近改动:2018-11-01 17:32:19.713464490 +0800
    创建时间:-
      文件:"exec.sh"
      大小:89        	块:8          IO 块:4096   普通文件
    设备:802h/2050d	Inode:21589       硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    最近访问:2018-11-01 17:41:17.316457156 +0800
    最近更改:2018-11-01 17:40:33.361457755 +0800
    最近改动:2018-11-01 17:40:33.361457755 +0800
    创建时间:-
    [root@localhost Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
    false      # 判断文件是否存在相同的设备和inode number
    [root@localhost Test]# [ eval.sh -nt exec.sh ] && echo true || echo false
    false      # 判断文件eval.sh修改日期是否比文件exec.sh新
    [root@localhost Test]# [ eval.sh -ot exec.sh ] && echo true || echo false
    true      # 判断文件eval.sh修改日期是否比文件exec.sh旧
    
    [root@localhost Test]# echo $centos
            # 变量未定义
    [root@localhost Test]# [ -f $centos ] && echo true || echo false
    true    # 变量未定义,却返回true,逻辑不符
    [root@localhost Test]# [ -f "$centos" ] && echo true || echo false
    false   # 添加引号后,逻辑正确
    

    注意事项如下:

    1、在判断文件的读写执行权限,不单单是看文件rwx属性,还要根据当前测试的用户是否也具备相应的操作权限
    2、在使用[]进行判断时,需要注意双引号特殊用法

    Shell字符测试

    常用字符测试表达式

       字符测试常用于判断字符是否相同,长度是否为零、字符是否为空等,常见的字符测试如下所示:

    字符操作符 英文含义 含义
    -n STRING nonzero 字符串长度不为零,则为真
    -z STRING zero 字符串长度为零,则为真
    STRING1 = STRING2 STRING1和STRING2是相等,则为真
    STRING1 != STRING2 STRING1和STRING2是不相等,则为真

    字符测试注意事项:

    1、字符测试中一定要添加双引号
    2、比较符号的两端一定要添加空格

    字符测试表达式示例

    [root@localhost Test]# [ -n "Test" ] && echo true || echo false
    true
    [root@localhost Test]# [ -z "Test" ] && echo true || echo false
    false
    [root@localhost Test]# [ "Test" = "Test" ] && echo true || echo false
    true
    [root@localhost Test]# [ "Test" != "Test" ] && echo true || echo false
    false
    [root@localhost Test]# [ -z "" ] && echo true || echo false
    true
    

    Shell整数测试

    常用整数测试表达式

    []/test比较符号 英文含义 ( ( ) )/[ [ ] ]比较符号
    -eq equal ==/=
    -ge greater than or equal >=
    -gt greater than >
    -le less than or equal <=
    -lt less than <
    -ne not equal !=

    整数测试表达式注意事项如下所示:

    1、=和!=也可以用在[]中进行比较,但在[]中使用< 和 > 时,需要进行转义,否则结果会出现不正确的情况
    2、比较符号两端需要添加空格

    整数测表达式示例

    [root@localhost ~]# [ 8 > 4 ] && echo true || echo false
    true
    [root@localhost ~]# [ 4 > 8 ] && echo true || echo false
    true            # 未进行转义时,结果输出存在错误
    [root@localhost ~]# [ 4 > 8 ] && echo true || echo false
    false           # 进行转义后,结果输出正确
    [root@localhost ~]# [ 8 != 8 ] && echo true || echo false
    false
    [root@localhost ~]# [ 8 == 8 ] && echo true || echo false
    true
    [root@localhost ~]# [ 8 = 8 ] && echo true || echo false
    true
    [root@localhost ~]# [ 4 -gt 8 ] && echo true || echo false
    false
    [root@localhost ~]# [ 4 -lt 8 ] && echo true || echo false
    true
    [root@localhost ~]# [ 8 -eq 8 ] && echo true || echo false
    true
    [root@localhost ~]# [ 8 -ne 8 ] && echo true || echo false
    false
    [root@localhost ~]# [[ 8 -ne 8 ]] && echo true || echo false
    false
    [root@localhost ~]# [[ 8 != 8 ]] && echo true || echo false
    false
    [root@localhost ~]# (( 8 != 8 )) && echo true || echo false
    false
    [root@localhost ~]# (( 8 == 8 )) && echo true || echo false
    true
    [root@localhost ~]# a=90;b=97 # 通过变量传递进行比较
    [root@localhost ~]# [ $a -gt $b ] && echo true || echo false
    false
    [root@localhost ~]# [ $a -le $b ] && echo true || echo false
    true
    

    在使用整数比较时,需要注意数字必须是整数,否则会出现报错。[]与(())区别如下所示:

    [ number1 -lt number2 ] # 比较运算符两端和[]间必须有空格
    ((number1<number2)) # (())无空格要求

    Shell逻辑测试

    常用逻辑测试表达式

    []/test比较符号 英文含义 ( ( ) )/[ [ ] ]比较符号
    -a and &&
    -o or ||
    ! not !

    在以上逻辑测试结果中

    • 1:代表结果为真True
    • 0:代表结果为假False
    • -a和-o仅适用于[],不能用在[[]]
    • []和[ [] ]两端必须有空格,( ( ) )无此要求

    逻辑测试表达式示例

    [root@localhost ~]# [ 8>7 -a 9>2 ] && echo true || echo false
    true
    [root@localhost ~]# [ 8>7 -o 9>2 ] && echo true || echo false
    true
    [root@localhost ~]# [ 8>7 -o 9>21 ] && echo true || echo false
    true
    [root@localhost ~]# [  ! 9>21 ] && echo true || echo false
    true
    [root@localhost ~]# [ -f /etc/hosts -a /etc/passwd ] && echo true || echo false
    true
    [root@localhost ~]# a="/etc/hosts";b="/etc/passwd"
    [root@localhost ~]# [ -f $a -o -f $b ] && echo true || echo false
    true
    [root@localhost ~]# [ -f "$a" ] && [ -f "$b" ] && echo true || echo false
    true
    [root@localhost ~]# [ -f $a ] && [ -f $b ] && echo true || echo false
    true
    [root@localhost ~]# [[ -f $a -a  -f $b ]] && echo true || echo false
    -bash: 条件表达式中有语法错误
    -bash: `-a' 附近有语法错误
    [root@localhost ~]# [[ -f $a &&  -f $b ]] && echo true || echo false
    true
    

    Shell条件测试总结

    测试表达式符号 [ ] test [ [ ] ] ( ( ) )
    边界是否需要空格 需要 需要 需要 不需要
    逻辑操作符 -a/-o/! -a/-o/! &&/||/! &&/||/!
    整数比较符 -eq/-ge/-gt/-le/-lt/-ne -eq/-ge/-gt/-le/-lt/-ne -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= =/>=/>/<=/</!=
    字符串比较符 =/==/!= =/==/!= =/==/!= =/==/!=
    是否支持通配符 不支持 不支持 支持 不支持

    本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
    MyQRCode.jpg

  • 相关阅读:
    Android性能优化典范(转)
    java分形树
    android通过pc脚本执行sqlite3脚本
    针对JD-GUI
    三星的中低端机使用AsyncTask的问题
    Github简明教程(转)
    android 5.0 (lollipop)源码编译环境搭建(Mac OS X)
    排队接水
    幂次方
    2020/4/12
  • 原文地址:https://www.cnblogs.com/surpassme/p/9959859.html
Copyright © 2020-2023  润新知