首先,我来帮大家回忆下Shell的测试表达式类型
1.整数测试表达式
[ TYPE [option] TYPE ]
其中option有以下几种选项:
-eq : 判断相等
-ne :不等
-gt :大于
-lt :小于
-ge :大于等于
-lt :小于等于
2.字符串测试表达式
== :判断是否相同
!= :不同
\> :按照ASCII码比较是否大于
\< :按照ASCII码比较是否小于
3.文件测试表达式
-e :文件是否存在
-f :是否是普通文件
-d :是否为目录
-w :是否可写
-r :是否可读
-x :是否可执行
那么,来说下我们今天的主角组合测试表达式:
组合测试表达式类型如下两种写法:
1. [ expression [option] expression ]
-a :全拼为and,也就是两个表达式的交集为真时返回真,假时返回假
-o :全拼为or,也就是两个表达式的并集,两个表达式中一个为真时返回真,全部为假时返回假
2.[ expression ] [option] [ expression ]
&&:两个表达式的交集为真时返回真,假时返回假
||:两个表达式的并集,两个表达式中一个为真时返回真,全部为假时返回假
还有一个关键字 !:表示非,下面针对实际列子来作分析:
列如: test.sh文件
1 #!/bin/bash
2 #
3 if [ $# -gt 3 -a $# -lt 6 ];then
4 echo 'ok'
5 else
6 echo 'no'
7 fi
上面这个是一个Shell脚本,用来判断执行该文件时所带参数的个数,如果大于3并且小于6时输出'ok',反之输出'no'
我们改造一下这个脚本:
1 #!/bin/bash
2 #
3 if [ ! $# -gt 3 -a $# -lt 6 ];then
4 echo 'ok'
5 else
6 echo 'no'
7 fi
我们在第一个表达式前面加上 '!',那么执行./test.sh 1 2 3 4 5 6 时,输出结果是'ok'还是'no'?
如果你的答案是'ok',那么请一定要看如下内容,如果你的答案是'no',那么你也可以回顾下知识点
我们来说下大家错误的理解:
如果小于等于3或者大于6时输出'ok',反之输出'no'
很多人思考错误的原因是把'!'当成了整个表达式的作用域,而事实上我们是组合测试表达式,'!'只对第一个表达式起了作用
我们正确的理解:
如果小于等于3并且小于等于6时输出'ok',反之输出'no'
现在我们把脚本改为实现:如果小于等于3或者大于6时输出'ok',反之输出'no':
1 #!/bin/bash
2 #
3 if [ ! $# -gt 3 -o ! $# -lt 6 ];then
4 echo 'ok'
5 else
6 echo 'no'
7 fi
注意,将option换成了 -o 代表或者,后面的表达式用'!'取反
好了,通过今天的列子有没有对组合测试表达式理解呢?