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

Joh*_*ohn 19 unix shell

我已经看到了使用脚本test命令[ ][[ ]].但是,当我们需要使用/usr/bin/test(( ))

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

问候,约翰

les*_*ana 20

回答你的问题:

  • 你想要什么/usr/bin/test时候使用test但不想在shell中使用(例如find ... -exec test ...)
  • 你希望(( ))在你有一个算术表达式来解决时使用,并且你正在使用bash,因为它(( ))是特定于bash的.

现在有一些背景知识:

该命令/usr/bin/testPOSIX标准所必需的.POSIX还要求将[其定义为别名test.test和之间的唯一区别[[需要最终参数为a ].

由于test在shell脚本中经常使用,因此大多数shell都有内置版本的test(和[).内置版本的优点是它消除了shell和可执行文件之间的上下文切换test.

我认为可以安全地假设在大多数情况下使用系统test或shell的内置并不重要test(除了内置的性能优势).

(( ))[[ ]]通过bash的(也许还有一些其他的shell)的介绍语法糖.(( ))评估算术表达式,同时[[ ]]评估逻辑表达式.两者都允许您以"更自然的语法"编写表达式.

决定使用[[[依赖于是否要使用"更自然的语法",而且,因为SH不支持[[,你是否要依赖于庆典.

使用的决定(( ))取决于你是否需要算术表达式,再次,因为sh不支持(( )),你是否想要依赖bash.POSIX替代方案(( ))$(( )).请注意,行为中存在一些细微差别.

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

也可以看看:

奖金:一些Debian开发人员曾经认为他们是否应使用系统test或shell内建test,因为在内置的实施一定的差异test.如果您对系统test和内置shell 的不同之处感兴趣,test那么您可以在这里阅读debian开发者讨论:http://bugs.debian.org/cgi-bin/bugreport.cgi?video = 267142.


bmk*_*bmk 6

(( ))评估bash(参见man bash)中的算术表达式.
[[ ]]评估bash(参见man bash)中的逻辑表达式.
[ ]test用于检查文件类型和比较值(请参阅参考资料man test)相同.