通常情况下,执行条件测试表达式会返回“真”或“假”,如果可以根据这些条件测试进行判断。
语法:
1)test 表达式
2)[ 测试表达式 ] 推荐的一种
3) [[ 测试表达式 ]]
4) (( 测试表达式 ))
注意:
1)[[ ]](双中括号)中可以使用通配符进行模式匹配 ,&& || > <操作符可以应用到[[ ]]
2) -a -o -gt -lt -eq -le等一般用在单中括号里
3)对于整数的关系运算,一样用(( ))
案例1:
[root@fenfa day04]# test -f /tmp/yuki.txt || mkdir /tmp/yuki.txt
[root@fenfa day04]# char=" "
[root@fenfa day04]# test -z "$char" && echo 1 || echo 0
0
案例2: 【】的使用
[root@fenfa day04]# [ -f /tmp/yuki01 ] || touch /tmp/yuki01
[root@fenfa day04]# [ -f /tmp/yuki01 ] && echo True || echo False
True
&& : 表达式前面为真,就执行后面的,如果为假,就不执行后面的
|| : 表达式前面为假,就执行后面的,如果为真,就不执行后面的
![](https://box.kancloud.cn/8395465f5b37f521082e3dd865a918a5_548x227.png)
二) 文件测试操作符
-f 文件 判断文件是否存在
-d目录 判断目录是否存在
-l 文件 判断文件是否为链接文件
-r 文件 判断文件是否可读
-w 文件 判断文件是否可写
-x文件 判断文件是否可执行
(执行脚本的用户,对这个文件,是否可读、写、执行)
-s文件 判断文件大小是否为0 不为0为真
案例:
[root@fenfa tmp]# touch yuki02.txt
[root@fenfa tmp]# [ -f /tmp/yuki02.txt ] && echo True || echo False
True
判断文件是否存在,存在则输出为true,不存在为false
[root@fenfa tmp]# mkdir louis
You have mail in /var/spool/mail/root
[root@fenfa tmp]# [ -f louis ] && echo 1 || echo 0
0
(因为刚刚创建的是目录,这个-f判断是文件)
[root@fenfa tmp]# [ -d /tmp/louis ] && echo 1 || echo 0
1
[root@fenfa tmp]# ll -l yuki02.txt
-rw-r--r-- 1 root root 0 Jan 25 00:12 yuki02.txt
(权限: rw r r)
[root@fenfa tmp]# [ -r /tmp/yuki02.txt ] && echo 1 || echo 0
1
(root可以运行,可读)
You have mail in /var/spool/mail/root
[root@fenfa tmp]# [ -w /tmp/yuki02.txt ] && echo 1 || echo 0
1
(root用户运行,可写)
[root@fenfa tmp]# su - www
welcome 1000,you home is /home/www,please don't delete file
[www@fenfa ~]$ [ -w /tmp/yuki02.txt ] && echo 1 || echo 0
0
(其他用户,www用户执行脚本,就没有写权限)
[www@fenfa ~]$ exit
logout
[root@fenfa tmp]# [ -x /tmp/yuki02.txt ] && echo 1 || echo 0
0
(root用户没有执行权限)
(说明: 运行脚本的用户,对这个文件是否有读写执行权限)
当表达式成立,也可以执行多个语句
[ 测试表达式 ] && {
语句1
语句2
语句3
.....
}
三)字符串操作符
功能:
1)比较2个字符串是否相同
2)测试字符串长度是否为0
-z “字符串” 字符串长度是否为空(0),空者为真
-n “字符串” 字符串长度是否不为空(不为0),非空者为真
“字符串1” =“字符串2” 字符串1是否等于字符串2,等于者为真
“字符串1” !=“字符串2” 字符串1是否不等于字符串2,不等于者为真
注意:
1)字符串或者字符串变量一定要加双引号
2) = != 的两端一定要个空格
[root@fenfa tmp]# var="/tmp/yuki01"
You have mail in /var/spool/mail/root
[root@fenfa tmp]# [ -z "$var" ] && echo 1 || echo 0
0
[root@fenfa tmp]# var1=""
[root@fenfa tmp]# [ -z "$var1" ] && echo 1 || echo 0
1
(-z: 字符串空为真)
[root@fenfa day04]# [ "`netstat -tunlp|grep 22|awk -F "[ :]+" 'NR==1{print $5}'`" = "22" ] && echo 1 || echo 0
1
三) 整数比较操作符
![](https://box.kancloud.cn/d2de3cff2cba8dea1b136622b135b37d_1053x266.png)
注意:在单中括号里,使用-gt -ge -le -lt -eq -ne等
[root@fenfa tmp]# [ "`ps -ef|grep sshd|wc -l`" -gt 1 ] && echo 1 || echo 0
1
[root@fenfa day04]# [ 5 > 2 ] && echo 1 || echo 0
1
[root@fenfa day04]# [ 5 -gt 2 ] && echo 1 || echo 0
1
[root@fenfa day04]# [[ 5 > 2 ]] && echo 1 || echo 0
1
You have mail in /var/spool/mail/root
[root@fenfa day04]# [[ 5 -gt 2 ]] && echo 1 || echo 0
1
(不建议在双中括号里,使用-gt,-le等)
四)逻辑操作符
![](https://box.kancloud.cn/f2d36d3125d2b1eb4f80a45247982a25_1050x150.png)
[root@fenfa day04]# [ -f /etc/hosts -a -f /etc/service ] && echo 1 || echo 0
0
You have mail in /var/spool/mail/root
[root@fenfa day04]# [ -f /etc/hosts -a -f /etc/services ] && echo 1 || echo 0
1
[root@fenfa day04]# [[ -f /etc/hosts && -f /etc/services ]] && echo 1 || echo 0
1
&&:
只有左右两边都为1的时候,结果才为真
一般可以作为短路操作符
&&: 只有前面为真(1),后面的才会被执行
||: 只有前面为假(0),后面才会被执行
[root@fenfa day04]# f1=/etc/rc.local
You have mail in /var/spool/mail/root
[root@fenfa day04]# f2=/etc/fstab
[root@fenfa day04]# [ -f "$f1" -a -f "$f2" ] && echo 1 || echo 0
1
[root@fenfa day04]# [[ -f "$f1" && -f "$f2" ]] && echo 1 || echo 0
1
(在双中括号里,一定要用&&,||, 在单中括号里要用-a -o)
[root@fenfa day04]# [ -z "$f1" -a -z "$f2" ] && echo 1 || echo 0
0
(-z: 字符串不空为假,就执行||后面的)
,