前言:本博文是参考老男孩出版的《shell编程实战》这本文档写的,这是写的非常好的一个文档。
博文大纲:
- 一、shell脚本的条件测试
- 二、文件测试表达式
- 三、字符串测试表达式
- 四、整数二元比较操作符
- 五、逻辑操作符
通常,在bash的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时也会与if等条件语句相结合,来完成测试判断,以减少程序运行的错误。
执行条件测试表达式后通常会返回“真”或“假”,就像执行命令后的返回值为0表示真,非0表示假一样。
在bash编程里,条件测试常用的语法形式如下:
- 语法1:test <测试表达式>:这是利用test命令进行条件测试表达的方法,test命令和“<测试表达式>”之间至少有一个空格。
- 语法2: [ <测试表达式> ]:这是通过[ ](单中括号)进行条件测试表达式的方法,和test命令的用法相同,这是比较推荐的一种方法。[ ]的边界和内容之间至少有一个空格。
- 语法3:[[ <测试表达式> ]]:这是通过[[ ]](双中括号)进行条件测试表达式的方法,是比test和[ ]更新的语法。[[ ]]的边界和内容之间至少有一个空格。
- 语法4:(( <测试表达式>)):这是通过(( ))(双小括号)进行条件测试表达式的方法,一般用于if语句里。(())(双小括号)两端不需要有空格。
- 语法1中的test命令和语法2中的[ ]是一样的。语法3中的[[]]是扩展test命令,语法4中的(())常用于计算,我一般使用的是语法2,方便些。
范例①:
[root@localhost ~]# test -f file && echo "true" || echo "false"
false
上面语句的意思是如果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命令测试的功能很强大,但是和[ ]、[[ ]]的功能有所重合,因此,在实际工作中选择一种自己喜欢的语法就好(我一般使用“[ ]”测试功能),对于其他的语法,能读懂别人写的脚本就可以了。
[ ]条件测试的语法格式为:[ <测试表达式> ]
注意:中括号内部的两端要有空格,[ ]和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
[ ] 测试语法的格式如下:
关于[[ ]]的使用方法和[ ]类似,区别在于[[ ]]的应用属于[ ]的扩展命令,功能给丰富些,如果双中括号里的表达式成立(为真),则执行&&后面的命令,否则执行 || 后面的命令。
在[[]]中可以使用通配符等进行模式匹配;并且&&、||、>、<等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般使用-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等的写法,可以使用类似>、<的写法。
常用的逻辑操作符如下:
关于上述操作符的具体解释如下:
———————— 本文至此结束,感谢阅读 ————————
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。