shell脚本的条件测试与比较
admin
2023-03-12 11:02:09
0

前言:本博文是参考老男孩出版的《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条件测试的简单语法及示例

范例①:

[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这个文件所以不成立)。

逻辑操作符&&和|| 的两端即可以有空格,也可以无空格,这主要是个人的习惯,在尽量减少空格的输入的同时,还要考虑代码的简洁、美观。

在上面的命令中,语法格式如下:
shell脚本的条件测试与比较

关于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

[ ] 测试语法的格式如下:

shell脚本的条件测试与比较

3、[[ ]]条件测试语法

关于[[ ]]的使用方法和[ ]类似,区别在于[[ ]]的应用属于[ ]的扩展命令,功能给丰富些,如果双中括号里的表达式成立(为真),则执行&&后面的命令,否则执行 || 后面的命令。

在[[]]中可以使用通配符等进行模式匹配;并且&&、||、>、<等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般使用-a、-o、-gt(用于整数)、-lt(用于整数)等操作符代替上文提到的用于[[]]中的符号。除了使用通配符功能之外,建议放弃这个双中括号的写法,虽然它是较新的test命令的语法格式。

[[ ]]测试语法的格式如下:

shell脚本的条件测试与比较

有关test、[ ]、[[ ]]这些操作符的用法,可以通过help test查询即可得到帮助,完整的[ ]、[[ ]]用法可通过man bash来获取。

二、文件测试表达式

如果在shell编程中要处理一个对象,一般是先对对象进行测试,只有在确定它符合要求时,才应进行操作处理,这样做的好处就是避免程序出错及无谓的系统资源消耗,这个需要测试的对象可以是文件、字符串、数字等。

在编写文件测试表达式时,常用的文件测试操作符如下:

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等。

常用的字符串测试操作符如下:
shell脚本的条件测试与比较

使用字符测试操作时需要注意以下事项:

  • 对于字符串的测试,一定要将字符串加双引号之后再进行比较,如[ -n "$abc" ]。
  • 比较符号(例如=和!=)的两端一定要有空格。
  • “!=”和“=”可用于比较两个字符串是否相同。

四、整数二元比较操作符

shell脚本的条件测试与比较

针对上面符号的特别说明:

  • “=”和“!=”也可在[ ] 做比较使用,但在[ ]中使用包含“>”和“<”的符号时,需要用反斜杠“\”进行转义,有时不转义虽然语法不会报错,但是结果可能会不对。
  • 也可以在[[ ]]中使用包含“-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等的写法,可以使用类似>、<的写法。

五、逻辑操作符

常用的逻辑操作符如下:
shell脚本的条件测试与比较

关于上述操作符的具体解释如下:

  • 逻辑操作符前后的表达式是否成立,一般用真假来表示。
  • “!”的中文意思是反,即与一个逻辑值相反的逻辑值。
  • -a的中文意思是“与”(and或&&),前后两个逻辑值都为“真”,综合返回值才为“真”,反之为“假”。
  • -o的中文意思是“或”(or或||),前后两个逻辑值只要有一个为“真”,返回值就为“真”。
  • 连接两个含有[]、test或[[]]的表达式可用&&或||来代替。
  • -a和&&的运算规则:只有逻辑操作符两端的表达式都成立时才为真;真(true)表示成立,对应的数字为1;假(false)表示不成立,对应的数字为0。

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

shell脚本的条件测试与比较

———————— 本文至此结束,感谢阅读 ————————

相关内容

热门资讯

一本正经胡说八道,谁为AI幻觉... AI幻觉频发,误导用户、毁损名誉的责任,该由谁来承担?南京律师李小亮在百度上搜索自己的信息,结果百度...
老人在直播间疯狂刷火箭 周佳欣、郑凯丹、朱娅、蒋婉、黄铃、王佳、李婉晴/文64岁的王雅达又往直播间里刷了一枚“火箭”。屏幕上...
汉坦病毒阳性乘客在乌斯怀亚港登... 自世卫组织(WHO)5月6日公布荷兰泛海探险公司(Oceanwide Expeditions)旗下极...
冰箱不制冷的原因有哪几种 冰箱的电压在正常的情况下,压缩机没有正常的运转,而且有噪声和旋转的声音,压缩机一旦出现故障,冰箱就会...
电视有哪几种方法 电视是我们生活中非常重要的一种媒介,它可以为我们带来大量的信息、乐趣和娱乐。在现代社会中,电视的使用...
装修风格有哪几种(今年流行的装... 摘要:装修的方式有很多种,下面这些就是我们在装修中常用的一种。①现代风,也叫功能派风,这个装修风格的...
大红鹰瓷砖哪里生产的 最佳回答 大红鹰瓷砖是广东佛山非常有名的一个瓷砖老品牌,据说这个品牌的瓷砖是在1974年成立的,老一...
走廊墙面怎么装饰 走廊的装修一定要简洁,因为是每天都会路过的地方,一般走廊装修都只是刷一个白墙或者是对走廊的颜色进行处...
苏巧慧阵营影射李四川家族涉黑,... 海峡导报综合报道 新北市长选战硝烟渐起,身处苏巧慧阵营的新北市议员翁震州发文质疑李四川家族在小琉球做...
红场阅兵后,普京同军官握手致意 据凤凰卫视报道,5月9日,俄罗斯胜利日阅兵接近尾声,普京与军官一一握手致意。