天天看点

8、Shell测试表达式

条件测试表达式

1、条件测试语法

条件测试语法 说明
test<测试表达式> 这是利用test命令进行条件测试表达式的方法,test命令和“<测试表达式”之间至少一个空格。
[ 测试表达式 ] 这是通过[](单括号)进行条件测试表达式的方法,和test命令的用法相同,推荐使用此方法,[]边界和内容之间至少一个空格。
[[ 测试表达式 ]] 这是通过[[]](双中括号)进行条件测试表达式的方法,是比test和[]更新的语法格式。[[]]边界和内容之间至少一个空格。
((<测试表达式>)) 这是通过(())(双小括号)进行条件测试表达式的方法,一般用于if语句里,(())(双小括号)两端不需要空格。

2、语法说明

(1)格式一和格式二是等价的。格式三是扩展的test命令,有网友推荐用格式三,实际上格式无好坏,看个人习惯。

(2)在[[]]中可以使用通配符进行模式匹配。&&、||、>、<等操作符。但不能应用于[]中,在[]中一般用-a、-o、-gt(用于整数)、lt(用于整数)替代删除操作符。

(3)对整数进行关系运算时,也可以使用shell的(())算术运算符。

3、查看帮助

man test      

4、test判断示例

(1)示例1:测试文件是否存在

[root@CentOS8 deploy]# cd /test/
[root@CentOS8 test]# test -f file && echo 1 || echo 0
0
[root@CentOS8 test]# touch file
[root@CentOS8 test]# test -f file && echo 1 || echo 0
1      

(2)示例2:非“!”的用法

[root@CentOS8 test]# test ! -f file && echo 1 || echo 0
0      

(3)示例3:-z 参数0值判断(判断长度为0)

[root@CentOS8 test]# arg=
[root@CentOS8 test]# test -z $arg && echo 1 || echo 0
1
[root@CentOS8 test]# arg='aaa'
0
[root@CentOS8 test]# test -z $arg && echo 1 || echo 0  
0      

(4)示例4:-n 参数的非0值判断(判断长度不为0)

[root@CentOS8 test]# arg=
[root@CentOS8 test]# test -n "$arg" && echo 1 || echo 0
0
[root@CentOS8 test]# arg="aaa"
[root@CentOS8 test]# test -n "$arg" && echo 1 || echo 0
1      

5、中括号“[]”判断示例

[root@CentOS8 test]# [ -f file ] && echo 1 || echo 0
0
[root@CentOS8 test]# touch file
[root@CentOS8 test]# [ -f file ] && echo 1 || echo 0
1      
[root@CentOS8 test]# [ ! -f file ] && echo 1 || echo 0 
0      

6、双中括号“[[]]”判断示例

[root@CentOS8 test]# [[ -f file ]] && echo 1 || echo 0
0
[root@CentOS8 test]# touch file
[root@CentOS8 test]# [[ -f file ]] && echo 1 || echo 0
1      
[root@CentOS8 test]# [[ ! -f file ]] && echo 1 || echo 0
0      

(3)示例3:[[]]中有&&、||等操作符的用法

[root@CentOS8 test]# [[ ! -f file && -d dir ]] && echo 1 || echo 0
0
[root@CentOS8 test]# touch file
[root@CentOS8 test]# [[ ! -f file && -d dir ]] && echo 1 || echo 0
0
[root@CentOS8 test]# [[ -f file && -d dir ]] && echo 1 || echo 0  
0
[root@CentOS8 test]# [[ -f file || -d dir ]] && echo 1 || echo 0  
1
[root@CentOS8 test]# mkdir dir
[root@CentOS8 test]# [[ -f file && -d dir ]] && echo 1 || echo 0
1      

文件测试表达式

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

(1)模拟环境

[root@CentOS8 test]# pwd
/test
[root@CentOS8 test]# mkdir 03
[root@CentOS8 test]# cd 03/
[root@CentOS8 03]# touch boxiaoyuan      

(2)测试-f参数

[root@CentOS8 03]# [ -f boxiaoyuan ] && echo 1 || echo 0
1
[root@CentOS8 03]# mkdir wangxiaosan
[root@CentOS8 03]# [ -f wangxiaosan ] && echo 1 || echo 0          
0      

(3)测试-e参数

[root@CentOS8 03]# [ -e boxiaoyuan ] && echo 1 || echo 0
1      

(4)测试-d参数

[root@CentOS8 03]# [ -d wangxiaosan ] && echo 1 || echo 0
1
[root@CentOS8 03]# [ -d boxiaoyuan ] && echo 1 || echo 0
0      

(5)测试-r、-w、-x参数(root用户比较特殊,没有权限,也可以读写)

[root@CentOS8 03]# chmod 000 boxiaoyuan
[root@CentOS8 03]# ls -l boxiaoyuan 
---------- 1 root root 0 Aug 27 07:28 boxiaoyuan
[root@CentOS8 03]# [ -r boxiaoyuan ] && echo 1 || echo 0
1
[root@CentOS8 03]# [ -w boxiaoyuan ] && echo 1 || echo 0  
1
[root@CentOS8 03]# [ -x boxiaoyuan ] && echo 1 || echo 0 
0
[root@CentOS8 03]# su - oracle
[oracle@CentOS8 ~]$ cd /test/
[oracle@CentOS8 test]$ [ -r boxiaoyuan ] && echo 1 || echo 0
0
[oracle@CentOS8 test]$ [ -w boxiaoyuan ] && echo 1 || echo 0 
0
[oracle@CentOS8 test]$ [ -x boxiaoyuan ] && echo 1 || echo 0 
0      

字符串测试操作符

1、作用

比较2个字符串是否相同、测试字符串长度是否为零、测试字符串是否为NULL(bash区分零长度字符串和空字符串)等。

2、注意事项

(1)在字符串判断中,“=”和“==”是等价的,都是比较两个字符串是否相同,但最好是用“==”,因为在其它地方“=”表示的是赋值。

(2)变量最好是用双引号“”括起来(单引号也行),如“aaa”、“$a”等,因为如果中间有空格、*号等符号时,就可能出错了。最好的方法是[  "${a}"="${b}" ]。

(3)字符串比较,比较特号两端最好有空格。如果没有空格,有时候会导致结果不正确。

(4)多参考系统脚本。

3、常用字符串操作符

操作符
-z "字符串" 如果字符串长度为0,表达式值则为真。-z表示zero
-n "字符串" 如果字符串长度不为0,表达式值则为真。-n表示no zero
"字符串1" = "字符串2" 如果字符串1等于字符串2,表达式值则为真。最好是用“==”代替“=”
"字符串1" != "字符串2" 如果字符串1不等于字符串2,表达式值则为真。最好是用“==”代替“=”

4、示例

[root@CentOS8 deploy]# [ -n "abc" ] && echo 1 || echo 0
1
[root@CentOS8 deploy]# [ -n "" ] && echo 1 || echo 0
0
[root@CentOS8 deploy]# test="abcd"
[root@CentOS8 deploy]# [ -n "$test" ] && echo 1 || echo 0
1
[root@CentOS8 deploy]# [ -n $test ] && echo 1 || echo 0  #没有用双引号“”将变量括起来,有时会不对。
1
[root@CentOS8 deploy]# test=""
[root@CentOS8 deploy]# [ -n $test ] && echo 1 || echo 0  #此处,变量为空,但没有没有用双引号“”将变量括起来,结果不对
1      

整数二元比较操作符

1、常用整数操作符

在[]中使用的比较符 在(())和[[]]中使用的比较符
-eq == 等于,equal的缩写
-ne != 不相等,not equal的缩写
-gt 大于,greater than的缩写
-ge >= 大于等于,greater equal的缩写
-lt 小于,less than的缩写
-le <= 小于等于,less equal的缩写
说明:如果[]中想使用在(())和[[]]中使用的比较符,除“=”和“!=”外,其它需要用"\"转义。麻烦,最好不用。

2、示例

[root@CentOS8 deploy]# [ 12 -eq 14 ] && echo 1 || echo 0
0
[root@CentOS8 deploy]# [ 12 -ne 14 ] && echo 1 || echo 0   
1
[root@CentOS8 deploy]# [ 12 -lt 14 ] && echo 1 || echo 0  
1
[root@CentOS8 deploy]# [ 12 -le 14 ] && echo 1 || echo 0 
1
[root@CentOS8 deploy]# [ 12 -ge 14 ] && echo 1 || echo 0  
0
[root@CentOS8 deploy]# [ 12 -gt 14 ] && echo 1 || echo 0  
0      

逻辑操作符

-a && 与,and
-o || 或,or
! 非,not

[root@CentOS8 deploy]# f1=/etc/rc.local
[root@CentOS8 deploy]# f2=/etc/services
[root@CentOS8 deploy]# [ -f "$f1" -a -f "$f2" ] && echo 1 || echo 0
1
[root@CentOS8 deploy]# [[ -f "$f1" && -f "$f2" ]] && echo 1 || echo 0  
1
[root@CentOS8 deploy]# [ -n "$f1" -a -z "$f2" ] && echo 1 || echo 0      
0
[root@CentOS8 deploy]# echo ${#f1} # 求字符串长度
13      

3、实际中多用[]语法

测试表达式符号 []
边界为是否需要空格 需要
!、-a、-o
整数比较操作符 -eq、-gt、-lt、-ge、-le
字符串比较操作符 =、==、!=
是否支持通配符匹配 不支持