前言:本博文是参考老男孩出版的《shell编程实战》这本文档写的,这是写的非常好的一个文档。
博文大纲:
- 一、shell脚本的条件测试
- 二、文件测试表达式
- 三、字符串测试表达式
- 四、整数二元比较操作符
- 五、逻辑操作符
通常,在bash的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时也会与if等条件语句相结合,来完成测试判断,以减少程序运行的错误。
执行条件测试表达式后通常会返回“真”或“假”,就像执行命令后的返回值为0表示真,非0表示假一样。
一、shell脚本的条件测试
在bash编程里,条件测试常用的语法形式如下:
- 语法1:test <测试表达式>:这是利用test命令进行条件测试表达的方法,test命令和“<测试表达式>”之间至少有一个空格。
- 语法2: [ <测试表达式> ]:这是通过[ ](单中括号)进行条件测试表达式的方法,和test命令的用法相同,这是比较推荐的一种方法。[ ]的边界和内容之间至少有一个空格。
- 语法3:[[ <测试表达式> ]]:这是通过[[ ]](双中括号)进行条件测试表达式的方法,是比test和[ ]更新的语法。[[ ]]的边界和内容之间至少有一个空格。
- 语法4:(( <测试表达式>)):这是通过(( ))(双小括号)进行条件测试表达式的方法,一般用于if语句里。(())(双小括号)两端不需要有空格。
- 语法1中的test命令和语法2中的[ ]是一样的。语法3中的[[]]是扩展test命令,语法4中的(())常用于计算,我一般使用的是语法2,方便些。
- 在[[ ]](双中括号)中可以使用通配符等进行模式匹配,这是其区别于其他几种语法格式的地方。
- &&、||、>、<等操作符可以应用于[[ ]]中,但不能应用于[ ]中,在[ ]中一般使用-a、-o、-gt、-lt(用于整数)来代替上面的操作。
- 对于整数的关系运算,也可以使用shell的算数运算符(( ))。
1、test条件测试的简单语法及示例
范例①:
上面语句的意思是如果file文件存在,则输出true,否则(||)输出false。这里的&&表示并且的意思。-f参数用于测试文件是否为普通文件,test命令若执行成功(为真),则执行&&后面的命令,而||后面的命令则是test命令执行失败之后(为假)所执行的命令。
test命令测试表达式的逻辑也可以用上面表达式形式的一半逻辑(即仅有一个&&或||)来测试,示例如下:
[root@localhost ~]# test -f file && echo 1 #若表达式成功,则输出1 1 [root@localhost ~]# test -f file || echo 0 #若表达式不成功,则输出0。 0在上面的-f选项表示文件存在且为普通文件则表达式成立(我这里没有file这个文件所以不成立)。
逻辑操作符&&和|| 的两端即可以有空格,也可以无空格,这主要是个人的习惯,在尽量减少空格的输入的同时,还要考虑代码的简洁、美观。
在上面的命令中,语法格式如下:关于test测试表达式的更多使用选项,可以执行man test查看帮助。
test命令测试的功能很强大,但是和[ ]、[[ ]]的功能有所重合,因此,在实际工作中选择一种自己喜欢的语法就好(我一般使用“[ ]”测试功能),对于其他的语法,能读懂别人写的脚本就可以了。
2、[ ](中括号)条件测试语法及示例
[ ]条件测试的语法格式为:[ <测试表达式> ]注意:中括号内部的两端要有空格,[ ]和test等价,即test的所有判断选项都可直接在[ ]里使用。
test条件测试与[ ]中括号条件测试语法的区别:
[root@localhost ~]# test -f file && echo "true" || echo "false" #使用test语法 false [root@localhost ~]# [ -f file ] && echo "true" || echo "false" #使用[ ]语法 false [root@localhost ~]# test -f file || echo "false" #使用test语法 false [root@localhost ~]# test -f file && echo "true" #使用test语法 [root@localhost ~]# [ -f file ] && echo "true" #使用[ ]语法 [root@localhost ~]# [ -f file ] || echo "false" #使用[ ]语法 false[ ] 测试语法的格式如下:
3、[[ ]]条件测试语法关于[[ ]]的使用方法和[ ]类似,区别在于[[ ]]的应用属于[ ]的扩展命令,功能给丰富些,如果双中括号里的表达式成立(为真),则执行&&后面的命令,否则执行 || 后面的命令。
在[[]]中可以使用通配符等进行模式匹配;并且&&、||、>、<等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般使用-a、-o、-gt(用于整数)、-lt(用于整数)等操作符代替上文提到的用于[[]]中的符号。除了使用通配符功能之外,建议放弃这个双中括号的写法,虽然它是较新的test命令的语法格式。
[[ ]]测试语法的格式如下:有关test、[ ]、[[ ]]这些操作符的用法,可以通过help test查询即可得到帮助,完整的[ ]、[[ ]]用法可通过man bash来获取。
二、文件测试表达式
如果在shell编程中要处理一个对象,一般是先对对象进行测试,只有在确定它符合要求时,才应进行操作处理,这样做的好处就是避免程序出错及无谓的系统资源消耗,这个需要测试的对象可以是文件、字符串、数字等。
在编写文件测试表达式时,常用的文件测试操作符如下:上面的这些操作符号对于[[ ]]、[ ]、test的测试表达式是通用的。
注意:测试文件的读、写、执行等属性,不光是根据文件属性rwx的标识来判断,还要看当前执行测试的用户是否真的可以按照对应的权限操作该文件。
如果用来测试一个变量,则被测试的变量需要加双引号将变量引起来,否则可能会出错。如下:
[root@localhost ~]# echo $abc #确认该变量没有存在 [root@localhost ~]# [ -f $abc ] && echo 1 || echo 0 #不加双引号的话,明明不存在,可照样输出了1 1 [root@localhost ~]# [ -f "$abc" ] && echo 1 || echo 0 #加上双引号就正常了 0当然,如果是文件的实体路径,那么加引号与不加引号的结果是一样的。
三、字符串测试表达式
字符串测试操作符的作用包括:比较两个字符串是否相同、测试字符串的长度是否为0、字符串是否为NULL等。
常用的字符串测试操作符如下:
使用字符测试操作时需要注意以下事项:
- 对于字符串的测试,一定要将字符串加双引号之后再进行比较,如[ -n "$abc" ]。
- 比较符号(例如=和!=)的两端一定要有空格。
- “!=”和“=”可用于比较两个字符串是否相同。
四、整数二元比较操作符
针对上面符号的特别说明:
- “=”和“!=”也可在[ ] 做比较使用,但在[ ]中使用包含“>”和“<”的符号时,需要用反斜杠“\”进行转义,有时不转义虽然语法不会报错,但是结果可能会不对。
- 也可以在[[ ]]中使用包含“-gt”和“-lt”的符号,但是不建议这样使用。
- 比较符号两端也要有空格。
使用举例:
[root@localhost ~]# [ 2 > 1 ] && echo 1 || echo 0 #看起来没问题哦,别着急,继续往下看 1 [root@localhost ~]# [ 2 < 1 ] && echo 1 || echo 0 #看吧,命名条件不成立,可还是输出了1 1 [root@localhost ~]# [ 2 \< 1 ] && echo 1 || echo 0 #转义一下再看,OK了。 0 [root@localhost ~]# [ 2 = 1 ] && echo 1 || echo 0 #比较相等符号是正确的 0 [root@localhost ~]# [ 2 = 2 ] && echo 1 || echo 0 #输出正确 1 [root@localhost ~]# [ 2 != 2 ] && echo 1 || echo 0 #输出正确 0建议在使用中,还是老老实实的对照上表来使用吧,别给自己找麻烦。对于生产环境中的整数比较,推荐使用[ ](类似-eq的用法)。
关于[ ]、[[ ]]、(( ))用法总结:
- 整数加双引号的比较是对的。
- [[ ]]中用类似-eq的写法是对的,[[ ]]中用类似>、<的写法也可能不对,有可能只会比较第一位,逻辑结果不对。
- [ ]中用类似>、<的写法在语法上虽然可能没错,但逻辑结果不对,可以使用=、!=正确比较。
- (( ))中不能使用类似-eq等的写法,可以使用类似>、<的写法。
五、逻辑操作符
常用的逻辑操作符如下:关于上述操作符的具体解释如下:
- 逻辑操作符前后的表达式是否成立,一般用真假来表示。
- “!”的中文意思是反,即与一个逻辑值相反的逻辑值。
- -a的中文意思是“与”(and或&&),前后两个逻辑值都为“真”,综合返回值才为“真”,反之为“假”。
- -o的中文意思是“或”(or或||),前后两个逻辑值只要有一个为“真”,返回值就为“真”。
- 连接两个含有[]、test或[[]]的表达式可用&&或||来代替。
- -a和&&的运算规则:只有逻辑操作符两端的表达式都成立时才为真;真(true)表示成立,对应的数字为1;假(false)表示不成立,对应的数字为0。
附加——测试表达式test、[]、[[]]、(())的区别总结
———————— 本文至此结束,感谢阅读 ————————