第五章 Shell脚本的条件测试与比较

5.1 条件测试方法综述

条件测试通常有如下4种语法形式:

image-20220412103904813.png

注意:

1、语法格式1和语法格式2的写法是等价的,语法3为扩展的表达式,建议使用语法2

2、在[[]]中可以使用通配符进行模式匹配。&&、||等可以应用。

语法1的实列:

image-20220411183410591.png

语法2的实列:

image-20220411183427227.png

image-20220411183437644.png

说明:如果root为目录并且root目录下的xujun.sh存在,即输出0,否则输出1。

注意:单中括号假如要多条件测试的话,是用-a和-o来表示。

语法3的实列:

image-20220411195144090.png

注意:双中括号假如要多条件测试的话,是用&&和||来表示,和单中括号是不一样的

5.2 文件测试表达式的用法

image-20220411195227658.png

  1. -g 文件:是否存在且拥有sgid权限
  2. -u 文件:是否存在且拥有suid权限
  3. -k 文件:是否存在且拥有sticky权限
  4. -N 文件:文件从上一次被读取之后是否被修改过
  5. -p 文件:是否存在并且为命名管道文件
  6. -S 文件:是否存在并且为套接字文件
  7. -b 文件:是否存在并且为块设备文件
  8. -c 文件:是否存在并且为字符设备文件
  9. -O 文件:当前用户是否为文件的属主
  10. -G 文件:当前用户是否属于文件的属组

5.2.1 文件测试表达式举例

1、普通文件测试表达式实列

wpsC655.tmp.jpg

说明:因为oldboy.txt文件是普通文件,所以测试结果为真

2、目录文件测试表达式实列

wpsC666.tmp.jpg

说明:因为oldboy.txt文件是普通文件,但是-d代表是目录,所以测试结果为假

wpsC667.tmp.jpg

说明:因为/tmp是一个目录,所以测试结果为真

3、文件测试表达式实列

wpsC678.tmp.jpg

说明:只要是文件,不管是普通文件还是目录,就为真

4、测试文件属性实列

wpsC679.tmp.jpg

wpsC67A.tmp.jpg

说明:如果要同时测试r和w,就用-a来连接这两个文件属性测试

5、测试shell变量实列

wpsC67B.tmp.jpg

注意:测试变量的时候,最好加上双引号,因为测试特殊变量的时候,可能会不准确

5.3 字符串测试表达式

image-20220411195514718.png

-z范例:

wpsB636.tmp.jpg

说明:字符串表示式用-z即可,因为在-z之前加一个!相当于-n,所以为了方便记忆,就是用-z就好了

字符是否相等的范例:

wpsB637.tmp.jpg

5.4 整数二元比较操作符

image-20220411195609311.png

小结:整数比较推荐下面用法

  1. [ $num1 -eq $num2 ] #<==注意空格,和比较符号
  2. (($num1>$num2)) #<==无需空格,常规数学比较符号

5.5 逻辑操作符

image-20220411195651784.png

  1. 与:
  2. 1 && 1 = 1
  3. 1 && 0 = 0
  4. 0 && 1 = 0
  5. 0 && 0 = 0
  6. 或:
  7. 1 || 1 = 1
  8. 1 || 0 = 1
  9. 0 || 1 = 1
  10. 0 || 0 = 0
  11. 非:
  12. ! 1 = 0
  13. ! 0 = 1
  14. 小结:
  15. 1.[]中用-a,-o,!
  16. 2.[[]]中用&&,||
  17. 3.test用法和[]相同
  18. 4.多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&和||

5.6 练习题

  1. #1、开发shell脚本,分别实现以脚本传参和read读入的方式比较两个整数的大小
  2. #!/bin/bash
  3. read -t 20 -p "pls tow num:" a b
  4. #no.1
  5. [ -z "$a" ] || [ -z "$b" ] && {
  6. echo "pls tow num"
  7. exit 1
  8. }
  9. #no.2
  10. expr $a + 10 &>/dev/null
  11. num1=$?
  12. expr $b + 10 &>/dev/null
  13. num2=$?
  14. [ "$num1" -eq 0 -a "$num2" -eq 0 ] || {
  15. echo "xu yao zheng shu"
  16. exit 2
  17. }
  18. #no.3
  19. [ $a -lt $b ] &&{
  20. echo "$a < $b"
  21. exit 0
  22. }
  23. [ $a -eq $b ] &&{
  24. echo "$a = $b"
  25. exit 0
  26. }
  27. [ $a -gt $b ] &&{
  28. echo "$a > $b"
  29. exit 0
  30. }
  31. #2、打印选择菜单,按照选择项一键安装不同的web服务
  32. #!/bin/bash
  33. menu(){
  34. cat <<END
  35. 1.[install lamp]
  36. 2.[install lnmp]
  37. 3.[exit]
  38. pls input the num you want;
  39. END
  40. }
  41. menu
  42. read -t 20 -p "which do you like?pls input the num:" a
  43. [ "$a" -eq "1" ]&&{
  44. echo "start installing lamp"
  45. exit 0
  46. }
  47. [ "$a" -eq "2" ]&&{
  48. echo "start installing lnmp"
  49. exit 0
  50. }
  51. [ "$a" -eq "3" ]&&{
  52. echo "exit"
  53. exit 0
  54. }
  55. [[ "$a" != "[1-3]" ]]&&{
  56. echo "input error"
  57. exit 0
  58. }