Shell条件判断:使用[]还是[[]]

https://mp.weixin.qq.com/s/Gzv2o90dwUlBIDFcnSWpIA

在编写Bash脚本时,逻辑表达式通常放在方括号[]中,但实际上,还有另一种方括号[[]]可供选择。这两种方括号在用法和功能上存在一些差异。本文将重点介绍[[]]的优势,并揭示如何判断当前环境是否支持Bash。

一、[]与[[]]的区别

  1. 标准与扩展:[]是Bourne Shell标准用法,而[[]]则是Bash的扩展用法。

  2. 功能差异:[]主要用于简单的逻辑比较、基本的模式匹配,并且它们在不同的Shell之间更具可移植性;而[[]]则提供了更丰富的比较操作符、适用于更高级的模式匹配。

二、[[]]的优势

在Bash环境中,[[]]提供了更加方便和灵活的语法,可以简化脚本编写过程,同时避免了一些在[]中需要处理的特殊情况。

  1. 字符串比较

使用[[]]进行字符串比较时,不需要对操作符进行转义,可以直接进行字符串比较,例如:

[[ "abc" < "def" ]]
而使用[]时需要转义操作符,例如:

[ "abc" < "def" ]
2. 变量处理

在[[]]中,不需要考虑空值引起的问题, 例如:

[[ str==hello]][[num -eq 1 ]]
而在[]中,需要确保变量有非空白值,否则会导致语法错误,根据表达式的不同,可能会收到错误“unary operator expected”或者“too many arguments”。对于字符串可以使用双引号将变量括起来,例如:

[ "$str" == hello ]
对于数值,需要额外判断变量非空,例如以下脚本片段:

if [ -n "num"];thenif[num -eq 1 ]; then
echo 变量num的值等于1
fi
fi
-n表示检查它后面的字符串是否非空。

  1. 逻辑操作

在[[]]中,可以使用&&和||分别进行逻辑与和逻辑或操作,例如:

[[ str== hello &&num -eq 1 ]]
而在[]中需要使用-a和-o,例如:

[ "str"==helloo"str" == Hello ]
4. 正则表达式匹配

[[]]支持使用=~进行正则表达式匹配,例如:

[[ "abc" =~ ^ab.* ]]
而[]不支持这种操作。可以使用grep命令,根据grep命令的退出状态判断是否匹配,例如以下脚本片段:

echo abc|grep -q ^ab.*
if [ $? -eq 0 ]; then
echo 字符串匹配该模式
fi

三、总结

通常,建议在Bash中使用双括号进行条件判断,因为它提供了更大的灵活性和更好的边缘情况处理。然而,如果需要编写更具可移植性的Shell脚本,建议使用单括号。

posted @   卡巴一枝花  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示