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,或扫描下面的二维码添加关注:

最新文章

  1. CSS-垂直|水平居中问题的解决方法总结
  2. Eclipse导入项目出现红色叹号的解决方法
  3. linux中的内存申请函数的区别 kmalloc, vmalloc
  4. Jquery UI 和Easy UI常用插件
  5. ThreadStart和ParameterizedThreadStart区别
  6. jQuery带遮罩层弹窗实现(附源码)
  7. LINUX下软件包的安装与使用
  8. Enterprise Library系列文章目录(转载)
  9. 如何定位摄像机,使物体在屏幕上始终具有相同的像素宽度和高度?(threes)
  10. sql server 常用的系统存储过程
  11. Python实现ID3(信息增益)
  12. Win XP 如何禁用系统的自动更新
  13. 【CF】135 Div2 Choosing Capital for Treeland
  14. Jenkins2.32.1+svn+maven安装配置与构建部署
  15. Linux系列教程(二十四)——Linux的系统管理
  16. 阿里云负载均衡SSL证书配置
  17. 835.Hamming距离
  18. 最课程阶段大作业06:U度节能平台控制系统
  19. 推荐 Net C# 逆向反编译四大工具利器
  20. [Codeforces Round #492 (Div. 1) ][B. Suit and Tie]

热门文章

  1. Linux下基于官方源代码RPM包构建自定义MySQL RPM包
  2. 【转】Java自学之路——by马士兵
  3. 使用CXF发布的WebService报错:org.apache.cxf.interceptor.Fault: The given SOAPAction does not match an operation
  4. 大型运输行业实战_day04_2_高级查询
  5. select 1 与 select null (转)
  6. logging的使用
  7. async与await
  8. sql嵌套更新
  9. gruop by报错this is incompatible with sql_mode=only_full_group_by
  10. Java NIO系列教程(十)DatagramChannel