跳到主要内容

[toc]

shell脚本条件测试

1.sehll脚本的条件测试

条件测试语法说明
test 测试表达式test命令和测试表达式之间至少有一个空格
[ 测试表达式 ][]边界和内容之间至少有一个空格
[[ 测试表达式 ]][[]]边界和内容之间至少有一个空格
((测试表达式))一般用于if语句里,(())俩边不需要有空格

&&||><等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般用-a-o-gt-lt代替上述操作

2.文件测试表达式

文件测试操作符说明
-d (directory)是否为目录
-f (file)是否为文件
-e (exist)文件是否存在
-r (read)是否只读
-w (write)是否可写
-x (executable)是否可执行
-s (size)文件大小不为0
-L (link)是否为链接文件
-nt (new than)f1 -nt f2 文件f1是否比f2新
-ot (older than)f1 -ot f2 文件f1是否比f2旧

-r-w都是判断文件属主是否有权限(root用户下都会返回1),属组和其他人即使有权限也返回0

-x 普通用户下判断属主是否有执行权限,即使属组和其他人有权限也返回0

-x root用户下只要文件有执行权限就返回1

文件测试表达式示例

判断文件属主是否有读权限

#创建文件
$ touch hehe
$ ll hehe
-rw-r--r-- 1 root root 0 Nov 22 13:30 hehe

#将hehe的权限改为000
$ chmod 000 hehe
$ ll hehe
---------- 1 root root 0 Nov 22 13:30 hehe

#判断文件是否只读
$ [ -r hehe ] && echo 1 || echo 0
#文件hehe没有任何权限,但是返回了1,因为当前用户是root
1

#切换到普通用户测试
$ su - www
$ touch hehe
$ chmod 000 hehe
$ ll
total 0
---------- 1 www www 0 Jun 25 10:14 hehe

#普通用户下,当文件没有读权限的时候返回是0
$ [ -r hehe ] && echo 1 || echo 0
0

判断文件属主是否有写权限

#判断文件是否可写
$ [ -w hehe ] && echo 1 || echo 0
#文件hehe没有任何权限,但是返回了1,因为当前用户是root
1

#切换到普通用户测试
$ su - www
$ touch hehe
$ chmod 000 hehe
$ ll
total 0
---------- 1 www www 0 Jun 25 10:14 hehe

#普通用户下,当文件没有写权限的时候返回是0
$ [ -w hehe ] && echo 1 || echo 0
0

判断文件是否有执行权限

#判断文件是否可执行
$ [ -x hehe ] && echo 1 || echo 0
#文件所有者是root的情况下,只有执行权限没有的时候会返回0,读写权限即使没有也会返回1
0

-f示例

$ echo $hehe
#变量hehe为空
$ [ -f $hehe ] && echo 1 || echo 0
1 #不加引号返回的结果不正确
$ [ -f "$hehe" ] && echo 1 || echo 0
0 #加引号返回才正确

3.字符串测试表达式

字符串测试操作符说明
-n 字符串若字符串长度不为0,则为真 no zero
-z 字符串若字符串长度为0,则为真 zero
字符串1=字符串2若字符串1等于字符串2,则为真
字符串1!=字符串2若字符串1不等于字符串2,则为真

字符串测试表达式特殊示例

示例1

$ [ "abc"="1" ] && echo 1 || echo 0
1 #结果不正确,进行字符串比较时,等号两端如果没有空格则会错误
$ [ "abc" = "1" ] && echo 1 || echo 0
0

示例2

$ var=""
$ echo $var

$ [ -n "$var" ] && echo 1 || echo 0
0
$ [ -n $var ] && echo 1 || echo 0
1 #结果不正确,因为变量var为空,字符串比较时,如果不加双引号则结果不正确

示例3

<(小于号) >(大于号)[]中使用时,需要用\转义
$ [ 1 < 3 ] && echo 1 || echo 0
-bash: 3: No such file or directory
0
$ [ 1 \< 3 ] && echo 1 || echo 0
1

4.整数二元比较操作符

整数二元比较操作符说明
-eq相等 equal
-ne不相等 not equal
-gt大于 granter than
-ge大于等于 granter equal
-lt小于 less than
-le小于等于 less equal

5.逻辑操作符

在[]和test中使用的操作符在[[]]和(())中使用的操作符说明
-a&&and,与 俩端都为真则结果为真
-o||or,或 俩端有一个为真则为真
not,非 俩端相反则为真

逻辑运算符示例

-a -o不能用在[[]]中,&& ||等不能用在[]中

#&&不能用在[]中,需要使用-a
$ [ -f /etc/hosts && -f /etc/services ] && echo 1 || echo 0
#bash: [: missing `]'
0

$ [ -f /etc/hosts -a -f /etc/services ] && echo 1 || echo 0
1

#-a不能用在[[]]中,需要使用&&
$ [[ -f /etc/hosts -a -f /etc/services ]] && echo 1 || echo 0
-bash: syntax error in conditional expression
#-bash: syntax error near `-a'

$ [[ -f /etc/hosts && -f /etc/services ]] && echo 1 || echo 0
1

6.测试表达式 test[][[]](()) 的区别总结

其中 [] 最为常用

测试表达式符号边界是否需要空格逻辑操作符整数比较操作符字符串比较操作符是否支持通配符匹配
test需要!-a-o-eq-gt-ltge-le===!=不支持
[]`需要!-a-o-eq-gt-ltge-le===!=不支持
[[]]需要**!&& 、``**-eq-gt-ltge-le或=><>=<=
(())不需要**!&& 、`` **=><>=<=