第五章 Shell脚本的条件测试与比较
5.1 条件测试方法综述
条件测试通常有如下4种语法形式:

注意:
1、语法格式1和语法格式2的写法是等价的,语法3为扩展的表达式,建议使用语法2
2、在[[]]中可以使用通配符进行模式匹配。&&、||等可以应用。
语法1的实列:

语法2的实列:


说明:如果root为目录并且root目录下的xujun.sh存在,即输出0,否则输出1。
注意:单中括号假如要多条件测试的话,是用-a和-o来表示。
语法3的实列:

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

-g 文件:是否存在且拥有sgid权限-u 文件:是否存在且拥有suid权限-k 文件:是否存在且拥有sticky权限-N 文件:文件从上一次被读取之后是否被修改过-p 文件:是否存在并且为命名管道文件-S 文件:是否存在并且为套接字文件-b 文件:是否存在并且为块设备文件-c 文件:是否存在并且为字符设备文件-O 文件:当前用户是否为文件的属主-G 文件:当前用户是否属于文件的属组
5.2.1 文件测试表达式举例
1、普通文件测试表达式实列

说明:因为oldboy.txt文件是普通文件,所以测试结果为真
2、目录文件测试表达式实列

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

说明:因为/tmp是一个目录,所以测试结果为真
3、文件测试表达式实列

说明:只要是文件,不管是普通文件还是目录,就为真
4、测试文件属性实列


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

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

-z范例:

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

5.4 整数二元比较操作符

小结:整数比较推荐下面用法
[ $num1 -eq $num2 ] #<==注意空格,和比较符号(($num1>$num2)) #<==无需空格,常规数学比较符号
5.5 逻辑操作符

与:1 && 1 = 11 && 0 = 00 && 1 = 00 && 0 = 0或:1 || 1 = 11 || 0 = 10 || 1 = 10 || 0 = 0非:! 1 = 0! 0 = 1小结:1.[]中用-a,-o,!2.[[]]中用&&,||3.test用法和[]相同4.多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&和||
5.6 练习题
#1、开发shell脚本,分别实现以脚本传参和read读入的方式比较两个整数的大小#!/bin/bashread -t 20 -p "pls tow num:" a b#no.1[ -z "$a" ] || [ -z "$b" ] && {echo "pls tow num"exit 1}#no.2expr $a + 10 &>/dev/nullnum1=$?expr $b + 10 &>/dev/nullnum2=$?[ "$num1" -eq 0 -a "$num2" -eq 0 ] || {echo "xu yao zheng shu"exit 2}#no.3[ $a -lt $b ] &&{echo "$a < $b"exit 0}[ $a -eq $b ] &&{echo "$a = $b"exit 0}[ $a -gt $b ] &&{echo "$a > $b"exit 0}#2、打印选择菜单,按照选择项一键安装不同的web服务#!/bin/bashmenu(){cat <<END1.[install lamp]2.[install lnmp]3.[exit]pls input the num you want;END}menuread -t 20 -p "which do you like?pls input the num:" a[ "$a" -eq "1" ]&&{echo "start installing lamp"exit 0}[ "$a" -eq "2" ]&&{echo "start installing lnmp"exit 0}[ "$a" -eq "3" ]&&{echo "exit"exit 0}[[ "$a" != "[1-3]" ]]&&{echo "input error"exit 0}
