为什么测试表示意外的括号?

NH.*_*NH. 4 bash shell sh

我的ifshell脚本中有一行如下所示:

if [ 0 -lt 2 -o (0 -gt 3 ) ]
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

line 3: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

所以我看着man test确保parens得到支持,果然,非常靠近手册页的顶部,它们是!是什么赋予了!?

上面的例子并不完全匹配代码,因为我试图清理它以证明一个观点,但如果您需要上下文,这是我的回购.

编辑:更改了if行以匹配错误.

Rus*_*nov 5

括号作为参数传递给test命令.的表达式仅仅是另一种方式来键入命令.唯一的区别是命令的最后一个参数必须是.[ ... ]test[]

因此,您应该像传递给命令的任何其他参数一样转义括号以避免shell解释:

if [ \( $# -lt 2 \) -o \( $# -gt 3 \) ]
Run Code Online (Sandbox Code Playgroud)

或者,使用单引号:

if [ '(' $# -lt 2 ')' -o '(' $# -gt 3 ')' ]
Run Code Online (Sandbox Code Playgroud)

从信息页面:

`test'
`['
          test EXPR

     Evaluate a conditional express ion EXPR and return a status of 0
     (true) or 1 (false).  Each operator and operand must be a separate
     argument.
Run Code Online (Sandbox Code Playgroud)

顺便说一下,表达式可以改写如下:

if builtin test \( $# -lt 2 \) -o \( $# -gt 3 \)
Run Code Online (Sandbox Code Playgroud)