如果我不关心兼容性或便携式问题,我还需要在Bash中使用测试构造[...]
吗?
许多教程/书籍都表明[[...]]
比[...]
更好,更灵活,例如[[...]]
支持glob / regex,但今天我仍然看到很多人更喜欢使用[...]
作为标准格式。
这背后的原因是什么? [...]
可以做什么但[[...]]
无法做到?
答案 0 :(得分:1)
我发现一个位功能[
实现但[[
没有。但是,它不是你应该使用的东西,所以我不会称之为使用[
而不是[[
。
-a
支持布局AND和OR的-o
和test
运算符:
if [ 3 -eq 3 -a 4 -eq 4 ]; then
echo true
fi
但是,尝试将它们与[[
一起使用是一种语法错误:
# The correct version is
# if [[ 3 -eq 3 && 4 -eq 4 ]]; then echo yay; fi
$ if [[ 3 -eq 3 -a 4 -eq 4 ]]; then echo yay; fi
bash: syntax error in conditional expression
bash: syntax error near `-a'
但是如果您使用[[
,则会使用&&
和||
,即使支持-a
和-o
也是如此。此外,即使POSIX标准建议使用[ ... ] && [ ... ]
代替-a
(和[ ... ] || [ ... ]
而不是-o
);这两个运算符是符合POSIX实现所不需要的扩展。
除了便携性问题之外,其他原因只是意见问题。
答案 1 :(得分:1)
除了[
的可移植性优势以及已经讨论过的[[
的更新功能和安全性/正确性属性之外,使用[[
值得注意的一个缺点是(在我看来)。
具体来说,当您使用它来验证/ etc时会发生什么。数值。
我问了一个问题here。
我也在this answer的评论中对此进行了讨论。
具体来说,这个
foo=bar
[ 5 -eq "$foo" ]
将输出错误,[
将返回2
,而这(包含或不包含变量的引号)
foo=bar
[[ 5 -eq "$foo" ]]
将默默返回1
和此
bar=5
foo=bar
[[ 5 -eq "$foo" ]]
将返回0
。
即[[
递归地计算裸变量。正如ruakh对chepner答案的评论所表明的那样,它将扩展变量中的表达式。
所以
foo="10 / 2"
[[ 5 -eq "$foo" ]]
也会返回true。
现在,这可能正是您想要的,但意味着您必须更加努力地验证输入/等。然后你会[
。