[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 、-lt 、ge 、-le | = 、== 、!= | 不支持 |
[]` | 需要 | ! 、-a 、-o | -eq 、-gt 、-lt 、ge 、-le | = 、== 、!= | 不支持 |
[[]] | 需要 | **! 、&& 、` | `** | -eq 、-gt 、-lt 、ge 、-le或= 、> 、< 、>= 、<= | |
(()) | 不需要 | **! 、&& 、` | ` ** | = 、> 、< 、>= 、<= |