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

时间:2016-11-22 05:30:03

标签: bash shell sh

我的shell脚本中有一条if行,如下所示:

if [ 0 -lt 2 -o (0 -gt 3 ) ]

这会产生错误:

line 3: syntax error near unexpected token `('

所以我看了man test以确保支持parens,当然,非常靠近手册页的顶部,它们是!什么给了!?

上面的示例与代码不完全匹配,因为我试图清除它以证明一个点,但如果您需要上下文,则为my repo

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

3 个答案:

答案 0 :(得分:5)

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

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

if [ \( $# -lt 2 \) -o \( $# -gt 3 \) ]

或者,使用单引号:

if [ '(' $# -lt 2 ')' -o '(' $# -gt 3 ')' ]

从信息页面:

`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.

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

if builtin test \( $# -lt 2 \) -o \( $# -gt 3 \)

答案 1 :(得分:3)

你的(...)里面没有[ ... ]未转义且不加引号,导致语法错误。

您可以改用:

[[ $# -lt 2 || $# -gt 3 ]]

或者使用:

[[ $# -lt 2 ]] || [[ $# -gt 3 ]]

答案 2 :(得分:3)

虽然这个解决方案没有直接回答这个问题,但是这里有一种使用C样式arithmetic expressions的替代方法,如果您处理bash中的数字

,这种方式很有效
#!/bin/bash

if (( "$#" < 2 || "$#" > 3 )); then