我看过使用test
命令和[ ]
或[[ ]]
的脚本。但我们什么时候需要使用/usr/bin/test
和(( ))
?
有什么时候我们需要选择后者吗?
此致 约翰
答案 0 :(得分:19)
回答你的问题:
/usr/bin/test
某些内容而不是外壳(例如test
)find ... -exec test ...
(( ))
,并且你正在使用bash,因为(( ))
是特定于bash的。现在有一些背景知识:
POSIX标准要求/usr/bin/test
命令。 POSIX还要求[
被定义为test
的别名。 test
和[
之间的唯一区别是[
要求最终参数为]
。
由于test
在shell脚本中经常使用,因此大多数shell都具有test
(和[
)的内置版本。内置版本的优点是它消除了shell和test
可执行文件之间的context switches。
我认为可以安全地假设在大多数情况下使用系统test
或shell的内置test
并不重要(除了内置的性能优势)。< / p>
(( ))
和[[ ]]
由bash(可能还有其他一些shell)引入syntactic sugar。 (( ))
计算算术表达式,而[[ ]]
计算逻辑表达式。两者都允许您以“更自然的语法”编写表达式。
使用[[
或[
的决定取决于您是否要使用“更自然的语法”,并且,因为sh不支持[[
,您是否要依赖在bash上。
使用(( ))
的决定取决于你是否需要算术表达式,而且,因为sh不支持(( ))
,是否要依赖bash。替代(( ))
的POSIX是$(( ))
。请注意,行为中存在一些细微差别。
以下链接详细解释了这些主题:
test
,[
和[[
之间的差异)let
,(( ))
和$(( ))
)另见:
奖励:一些debian开发人员曾经争论他们是否应该使用系统test
或shell内置test
,因为内置test
的实现存在一些差异。如果您对系统test
和shell内置test
的差异的详细信息感兴趣,那么您可以在此处阅读debian开发者讨论:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267142。
答案 1 :(得分:6)
(( ))
评估bash
中的算术表达式(参见man bash
)
[[ ]]
评估bash
中的逻辑表达式(请参阅man bash
)
[ ]
与test
相同,用于检查文件类型并比较值(请参阅man test
)。
答案 2 :(得分:3)
当您希望事情运行得更慢时,可以使用/usr/bin/test
。现代炮弹(自1990年左右以来发布的大部分炮弹,可能更早)都有test
及其同义词[
作为内置命令。正式调用/usr/bin/test
将是一种解散行为,因为shell有一个破坏的测试命令,并且系统独立是正常的 - 但最好是获得一个固定的shell。
您使用(( ... ))
进行算术运算。老式的替代方案是expr
命令。这很难使用,因为它需要大量的转义 - 它是/是一个单独的可执行文件,你必须通过shell获得大量的shell元字符到expr
。因此:
x=$(expr $y '*' $z)
而不是
((x = y * z))
您甚至不必在$
中使用(( ... ))
修饰变量。