Shell test 单中括号[] 双中括号[[]] 的区别

在写Shell脚本的时候,经常在写条件判断语句时不知道该用[] 还是 [[]],首先我们来看他们的类别:

$type [ [[ test
[ is a shell builtin
[[ is a shell keyword
test is a shell builtin

[ test 是 Shell 的内部命令,而[[是Shell的关键字。

$test -f settings.py && echo True
True

$[ -f settings.py ] && echo True
True

[ 和test 是相等的

$[ 2 < 1 ] && echo True || echo False
True

$[[ 2 < 1 ]] && echo True || echo False
False

既然是命令, 它就和参数组合为一体被 shell 解释,那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。

x=1
y=1


$[ $x == 1 && $y == 1 ] && echo True || echo False
-bash: [: missing `]'
False


$[[ $x == 1 && $y == 1 ]] && echo True || echo False
True


$[ $x == 1 -a $y == 1 ] && echo True || echo False
True

[[中使用&&||表示逻辑与和逻辑或。[中使用-a 和-o 表示逻辑与和逻辑或。

$[[ 'abcd' == a*d ]] && echo True || echo False
True


$[ 'abcd' == a*d ] && echo True || echo False
False

[[支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

总结

使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,

但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]

bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

$[ !(pip list | grep pip) ] && echo True || echo False
-bash: [: too many arguments
False


$[[ !(pip list | grep pip) ]] && echo True || echo False
True

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值