条件测试表达式
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 |
字符串比较操作符 | =、==、!= |
是否支持通配符匹配 | 不支持 |