Bash 中的 `test ( foo )` / `[ ( foo )` 是什么?

Abd*_*ull 2 bash syntax-error

Bash 参考手册提到了以下关于test/[命令的内容:

\n
\n

1 个参数

\n

当且仅当参数不为空时,表达式才为 true。

\n
\n

到目前为止,一切都很好:

\n
$ test "foo"\n$ echo $?\n0\n\n$ test foo\n$ echo $?\n0\n\n$ test ""\n$ echo $?\n1\n\n$ SET_VARIABLE="hello"\n$ test $SET_VARIABLE\n$ echo $?\n0\n\n$ unset UNSET_VARIABLE\n$ test $UNSET_VARIABLE\n$ echo $?\n1\n\n$ NULL_VARIABLE=\n$ test $NULL_VARIABLE\n$ echo $?\n1\n
Run Code Online (Sandbox Code Playgroud)\n

但是,手册提到了以下三个论点:

\n
\n

3 个参数

\n

...

\n

如果第一个参数恰好是 \xe2\x80\x98(\xe2\x80\x99 并且第三个参数恰好是 \xe2\x80\x98)\xe2\x80\x99,则结果是第二个参数的单参数测试争论。

\n
\n

我找不到这个三参数案例的任何有效示例;任何尝试都会导致语法错误:

\n
$ test ( "foo" )\nbash: syntax error near unexpected token `"foo"\'\n$ echo $?\n2\n\n$ test ( foo )\nbash: syntax error near unexpected token `foo\'\n$ echo $?\n2\n\n$ test ( "" )\nbash: syntax error near unexpected token `""\'\n$ echo $?\n2\n
Run Code Online (Sandbox Code Playgroud)\n

相应的 4 参数情况也会发生相同的语法错误:test ( -d /boot )因语法错误而失败,而 2 参数表达式test -d /boot工作正常。

\n

我的bash版本是5.1.4(1)-release,并在末尾man bash声明GNU Bash 5.1 ,并且联机帮助页提到了有问题的语法。

\n

\ 的括号语法的工作示例是什么test?该语法可以用来做什么?

\n

Ini*_*ian 5

您对 的三参数用法是正确的test,但是()是 bash 中的保留字,表示在子 shell 上下文中运行内部提供的命令。当尝试与 一起使用时,您需要剥夺其特殊含义test

$ touch foo
$ test \( -f foo \)
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

如果您使用 bash 并且不担心可移植性,那么更喜欢[[旧版[内置。有关两者之间差异的更多见解,请参阅BashFAQ/031 -之间的区别是什么?test\[\[\[