我们还需要在Bash中使用`[...]`吗?

时间:2015-08-31 21:23:14

标签: bash if-statement conditional-statements

如果我不关心兼容性或便携式问题,我还需要在Bash中使用测试构造[...]吗?

许多教程/书籍都表明[[...]][...]更好,更灵活,例如[[...]]支持glob / regex,但今天我仍然看到很多人更喜欢使用[...]作为标准格式。

这背后的原因是什么? [...]可以做什么但[[...]]无法做到?

2 个答案:

答案 0 :(得分:1)

我发现一个位功能[实现但[[没有。但是,它不是你应该使用的东西,所以我不会称之为使用[而不是[[

-a支持布局AND和OR的-otest运算符:

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。

现在,这可能正是您想要的,但意味着您必须更加努力地验证输入/等。然后你会[