[关闭]
@yanglt7 2018-10-24T14:06:40.000000Z 字数 3487 阅读 713

《Shell 编程》05_Shell 脚本的条件测试与比较

Shell


5.1 Shell 脚本的条件测试

条件测试语法
语法1:test <测试表达式>
语法2:[<测试表达式>]
语法3:[[<测试表达式>]]
语法4:((<测试表达式>))

5.1.1 test

语法格式:test <测试表达式>

1)-f 选项(文件存在且为普通文件则表达式成立)

  1. test -f file && echo true || echo false

2)一半逻辑

  1. test -f file echo 1 #<== 若表达式成功,则输出1
  2. test -f file echo 0 #<== 若表达式不成功,则输出0

3)示例

  1. [root@web001 scripts]# test -f file && echo 1 || echo 0
  2. 0
  3. [root@web001 scripts]# touch file
  4. [root@web001 scripts]# test -f file && echo 1 || echo 0
  5. 1

4) -z 选项(如测试字符串的长度为0,则表达式成立)

  1. [root@web001 scripts]# test -z "ylt" && echo 1 || echo 0
  2. 0
  3. [root@web001 scripts]# test -z "" && echo 1 || echo 0
  4. 1

5.1.2 [](中括号)

语法格式:[<测试表达式>] 中括号内两端需要空格

1)若文件 file 存在,则输出 true,否则输出 false。

  1. [ -f file ] && echo true || echo false

2)一半逻辑

  1. [ -f file] echo 1 #<== 若表达式成功,则输出1
  2. [ -f file ] echo 0 #<== 若表达式不成功,则输出0

3)示例

  1. [root@web001 scripts]# [ -f file ] && echo 1 || echo 0
  2. 0
  3. [root@web001 scripts]# touch file
  4. [root@web001 scripts]# [ -f file ] && echo 1 || echo 0
  5. 1

5.1.3 [[]]

语法格式:[[<测试表达式>]] 双中括号内两端需要空格

1)若文件 file 存在,则输出 true,否则输出 false。

  1. [[ -f file ]] && echo true || echo false

2)一半逻辑

  1. [[ -f file ]] echo 1 #<== 若表达式成功,则输出1
  2. [[ -f file ]] echo 0 #<== 若表达式不成功,则输出0

3)示例

  1. [root@web001 scripts]# [[ -f file ]] && echo 1 || echo 0
  2. 0
  3. [root@web001 scripts]# touch file
  4. [root@web001 scripts]# [[ -f file ]] && echo 1 || echo 0
  5. 1

5.2 文件测试表达式

常用文件测试操作符 说明
-d 文件,directory 文件存在且为目录则为真,即测试表达式成立
-f 文件,file 文件存在且为普通文件则为真,即测试表达式成立
-e 文件,exist 文件存在则为真,即测试表达式成立,-e 不辨别文件还是目录
-r 文件,read 文件存在且可读则为真,即测试表达式成立
-s 文件,size 文件存在且文件大小不为 0 则为真,即测试表达式成立
-w 文件,write 文件存在且可写则为真,即测试表达式成立
-x 文件,executable 文件存在且可执行则为真,即测试表达式成立
-L 文件,link 文件存在且为链接文件则为真,即测试表达式成立
-d 文件,directory 文件存在且为目录则为真,即测试表达式成立
f1 nt f2,newer than 文件 f1 比 文件 f2 新则为真,即测试表达式成立。根据文件的修改时间来计算
f1 ot f2,older than 文件 f1 比 文件 f2 旧则为真,即测试表达式成立。根据文件的修改时间来计算

1)测试文件的读、写、执行等属性,不光是根据文件属性 rwx 的标识来判断,还要看当前执行测试的用户是否真的看按照对应的权限操作该文件。

  1. [root@web001 scripts]# ll file
  2. -rw-r--r-- 1 root root 0 Oct 24 03:57 file
  3. [root@web001 scripts]#
  4. [root@web001 scripts]# [ -r file ] && echo 1 || echo 0
  5. 1
  6. [root@web001 scripts]# [ -w file ] && echo 1 || echo 0
  7. 1
  8. [root@web001 scripts]# [ -x file ] && echo 1 || echo 0
  9. 0
  10. [root@web001 scripts]# chmod 001 file
  11. [root@web001 scripts]# ll file
  12. ---------x 1 root root 0 Oct 24 03:57 file
  13. [root@web001 scripts]# [ -w file ] && echo 1 || echo 0
  14. 1
  15. [root@web001 scripts]# echo "echo test" >file
  16. [root@web001 scripts]# [ -r file ] && echo 1 || echo 0
  17. 1
  18. [root@web001 scripts]# cat file
  19. echo test
  20. [root@web001 scripts]# [ -x file ] && echo 1 || echo 0
  21. 1
  22. [root@web001 scripts]# ./file
  23. test

2)[] 测试变量需要加双引号

  1. [root@web001 scripts]# echo $ylt
  2. [root@web001 scripts]# [ -f $ylt ] && echo 1 || echo 0
  3. 1
  4. [root@web001 scripts]# [ -f "$ylt" ] && echo 1 || echo 0
  5. 0

3)特殊测试表达式

  1. [ 条件1 ] && {
  2. 命令1
  3. 命令2
  4. 命令3
  5. }
  6. [[ 条件1 ]]
  1. || {
  2. 命令1
  3. 命令2
  4. 命令3
  5. }
  6. test 条件1 && {
  7. 命令1
  8. 命令2
  9. 命令3
  10. }

相当于

  1. if [ 条件1 ]
  2. then
  3. 命令1
  4. 命令2
  5. 命令3
  6. fi

5.4 字符串测试表达式

常用字符串测试操作符 说明
-n "字符串" 若字符串的长度不为 0,则为真。
-z "字符串" 若字符串的长度为 0,则为真。
"串1" = "串2" 若字符串1等于字符串2,则为真
"串1" != "串2" 若字符串1不等于字符串2,则为真

5.5 整数二元比较操作符

在 [] 以及 test 中使用的比较符号 在 [[]] 及 (()) 中使用的比较符号 说明
-eq == 或 = 相等,equal
-ne != 不相等,not equal
-gt > 大于,greater than
-ge >= 大于等于,greater equal
-lt < 小于,less than
-le <= 小于等于,less equal

5.6 逻辑操作符

在 [] 以及 test 中使用的操作符 在 [[]] 及 (()) 中使用的操作符 说明
-a && and,与,两端都为真,则结果为真
-o || or,或,两端有一个为真,则结果为真
! ! not,非,两端相反,则结果为真

- 连接两含 [] 、test 或 [[]] 的表达式可用 && 或 ||。
- 在 [[]] 通配符匹配的场景下,其他测试表达式无法替代。因此,如果需要通配符或正则表达式就用 [[]]。

5.7 测试表达式 test、 [] 、(()) 、[[]] 的区别总结

测试表达式符号 [] test [[]] (())
边界是否需要空格 需要 需要 需要 不需要
逻辑操作符 !、-a、-o !、-a、-o !、&&、|| !、&&、||
整数比较操作符 -eq、-ne、-gt、-lt、-ge、-le -eq、-ne、-gt、-lt、-ge、-le -eq、-ne、-gt、-lt、-ge、-le 或 =、>、<、>=、<= =、>、<、>=、<=
字符串比较操作符 =、==、!= =、==、!= =、==、!= =、==、!=
是否支持通配符匹配 不支持 不支持 支持 不支持
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注