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 builtin
test
,因为builtin
test
的实现存在一些差异。如果您对system
test
和shell builtin
test
的差异的细节感兴趣,那么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还支持
[[]]
(())
(至少是我刚才尝试过的版本)。