什么时候使用(())或/ usr / bin / test

时间:2011-06-30 12:40:20

标签: shell unix

我看过使用test命令和[ ][[ ]]的脚本。但我们什么时候需要使用/usr/bin/test(( ))

有什么时候我们需要选择后者吗?

此致 约翰

3 个答案:

答案 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是$(( ))。请注意,行为中存在一些细微差别。

以下链接详细解释了这些主题:

另见:

奖励:一些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))

您甚至不必在$中使用(( ... ))修饰变量。