https://mp.weixin.qq.com/s/Gzv2o90dwUlBIDFcnSWpIA
在编写Bash脚本时,逻辑表达式通常放在方括号[]中,但实际上,还有另一种方括号[[]]可供选择。这两种方括号在用法和功能上存在一些差异。本文将重点介绍[[]]的优势,并揭示如何判断当前环境是否支持Bash。
一、[]与[[]]的区别
-
标准与扩展:[]是Bourne Shell标准用法,而[[]]则是Bash的扩展用法。
-
功能差异:[]主要用于简单的逻辑比较、基本的模式匹配,并且它们在不同的Shell之间更具可移植性;而[[]]则提供了更丰富的比较操作符、适用于更高级的模式匹配。
二、[[]]的优势
在Bash环境中,[[]]提供了更加方便和灵活的语法,可以简化脚本编写过程,同时避免了一些在[]中需要处理的特殊情况。
- 字符串比较
使用[[]]进行字符串比较时,不需要对操作符进行转义,可以直接进行字符串比较,例如:
[[ "abc" < "def" ]]
而使用[]时需要转义操作符,例如:
[ "abc" < "def" ]
2. 变量处理
在[[]]中,不需要考虑空值引起的问题, 例如:
[[ $str == hello ]]
[[ $num -eq 1 ]]
而在[]中,需要确保变量有非空白值,否则会导致语法错误,根据表达式的不同,可能会收到错误“unary operator expected”或者“too many arguments”。对于字符串可以使用双引号将变量括起来,例如:
[ "$str" == hello ]
对于数值,需要额外判断变量非空,例如以下脚本片段:
if [ -n "$num" ]; then
if [ $num -eq 1 ]; then
echo 变量num的值等于1
fi
fi
-n表示检查它后面的字符串是否非空。
- 逻辑操作
在[[]]中,可以使用&&和||分别进行逻辑与和逻辑或操作,例如:
[[ $str== hello && $num -eq 1 ]]
而在[]中需要使用-a和-o,例如:
[ "\(str" == hello -o "\)str" == Hello ]
4. 正则表达式匹配
[[]]支持使用=~进行正则表达式匹配,例如:
[[ "abc" =~ ^ab.* ]]
而[]不支持这种操作。可以使用grep命令,根据grep命令的退出状态判断是否匹配,例如以下脚本片段:
echo abc|grep -q ^ab.*
if [ $? -eq 0 ]; then
echo 字符串匹配该模式
fi
三、总结
通常,建议在Bash中使用双括号进行条件判断,因为它提供了更大的灵活性和更好的边缘情况处理。然而,如果需要编写更具可移植性的Shell脚本,建议使用单括号。
标签:例如,Shell,判断,num,str,条件,字符串,Bash From: https://www.cnblogs.com/titianblog/p/18005552