shell脚本条件测试

一、sehll脚本的条件测试

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

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

二、文件测试表达式

文件测试操作符 说明
-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                    #加引号返回才正确

三、字符串测试表达式

字符串测试操作符 说明
-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

四、整数二元比较操作符

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

五、逻辑操作符

在[]和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

六、测试表达式test、[]、[[]]、(())的区别总结

其中[]最为常用

测试表达式符号 边界是否需要空格 逻辑操作符 整数比较操作符 字符串比较操作符 是否支持通配符匹配
test 需要 !、-a、-o -eq、-gt、-lt、ge、-le =、==、!= 不支持
[] 需要 !、-a、-o -eq、-gt、-lt、ge、-le =、==、!= 不支持
[[]] 需要 **!、&&、\ \ ** -eq、-gt、-lt、ge、-le或=、>、<、>=、<= =、==、!= 支持
(()) 不需要 !、&&、 =、>、<、>=、<= =、==、!= 不支持
泡泡吐肥皂o © gitbook.pptfz.top 2021 all right reserved,powered by Gitbook文件修订时间: 秃笔南波湾!!!

results matching ""

    No results matching ""