Shell 何时使用(())或/usr/bin/test
我见过使用Shell 何时使用(())或/usr/bin/test,shell,unix,Shell,Unix,我见过使用test命令和[]或[[]]的脚本。但是什么时候我们需要使用/usr/bin/test和(()) 有没有什么时候我们需要选择后者 问候,, John(())在bash中计算算术表达式(请参见manbash)。 [[]]计算bash中的逻辑表达式(请参见manbash)。 []与test相同,用于检查文件类型和比较值(请参见mantest)。回答您的问题: 当您想测试某些东西而不是在shell中时,您想使用/usr/bin/test(例如查找…-执行测试…) 当您有一个算术表达式要求解
test
命令和[]
或[[]]
的脚本。但是什么时候我们需要使用/usr/bin/test
和(())
有没有什么时候我们需要选择后者
问候,,
John(())
在bash
中计算算术表达式(请参见manbash
)。[[]]
计算bash
中的逻辑表达式(请参见manbash
)。[]
与test
相同,用于检查文件类型和比较值(请参见mantest
)。回答您的问题:
- 当您想
某些东西而不是在shell中时,您想使用测试
(例如/usr/bin/test
)查找…-执行测试…
- 当您有一个算术表达式要求解时,您希望使用
,并且您正在使用bash,因为(())
是特定于bash的(())
/usr/bin/test
。POSIX还要求将[
定义为test
的别名。test
和[
之间的唯一区别是[
要求最后一个参数是]
由于在shell脚本中经常使用test
,因此大多数shell都有一个内置版本的test
(和[
)。内置版本的优点是可以避免这种情况。这取决于您在脚本中如何使用test
,可以是一个可测量的性能优势
我认为可以安全地假设,在大多数情况下,无论您是使用系统test
还是shell的内置test
,都无关紧要。但是如果您想在find-exec
情况下使用test
,那么当然您必须使用系统test
,因为find
无法使用地狱测试
(())
和[[]]
是由bash(可能还有其他一些shell)引入的。(())
计算算术表达式,而[[]]
计算逻辑表达式。这两种方法都允许您以“更自然的语法”编写表达式
使用[[
或[
的决定取决于您是否希望使用“更自然的语法”,并且,由于sh不支持[[
,因此您是否希望依赖bash
使用(())
的决定取决于您是否需要算术表达式,而且,由于sh不支持(())
,因此您是否需要依赖bash。(())
的POSIX替代方案是$(())
。请注意,在行为上存在一些细微的差异
以下链接详细介绍了这些主题:
- (测试、
和[
之间的差异)[[
- (
,let
和(())
)$(())
- (以上所有内容)
好处:一些debian开发人员曾经争论他们应该使用system
test
还是shell builtintest
,因为builtintest
的实现存在一些差异。如果您对systemtest
和shell builtintest
的差异的细节感兴趣,那么n您可以在这里阅读debian开发者讨论:。当您想让事情运行得更慢时,您可以使用/usr/bin/test
。现代shell(大约从1990年开始发布的大多数shell,可能更早)有test
及其同义词[
作为内置命令。正式调用/usr/bin/test
将是一种绝望的行为,因为shell有一个坏掉的测试命令,并且系统独立是正常的-但是最好得到一个固定的shell
你可以使用(…)
来做算术运算。老式的替代方法是expr
命令。这很难使用,因为它需要大量转义-它是/是一个单独的可执行文件,你必须让大量的shell元字符通过shell进入expr
。因此:
x=$(expr $y '*' $z)
而不是
((x = y * z))
你甚至不必在
(…)
中用$
来修饰变量,例如,我刚刚在一个Makefile中添加了/usr/bin/test,因为Makefile没有定义SHELL,一些用户的SHELL=bash,而另一些用户的SHELL=csh。所以我不能依赖更好的测试,(())或[[]],可用//当然,你可能会说使用Make根本就是一个bug。或者至少没有在Make中定义SHELL。值得一提的是,zsh和ksh还支持[[]]
和(())
(至少是我刚才尝试过的版本)。