第五章 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 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
或:
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非:
! 1 = 0
! 0 = 1
小结:
1.[]中用-a,-o,!
2.[[]]中用&&,||
3.test用法和[]相同
4.多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&和||
5.6 练习题
#1、开发shell脚本,分别实现以脚本传参和read读入的方式比较两个整数的大小
#!/bin/bash
read -t 20 -p "pls tow num:" a b
#no.1
[ -z "$a" ] || [ -z "$b" ] && {
echo "pls tow num"
exit 1
}
#no.2
expr $a + 10 &>/dev/null
num1=$?
expr $b + 10 &>/dev/null
num2=$?
[ "$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/bash
menu(){
cat <<END
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want;
END
}
menu
read -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
}