我的shell脚本中有一条if
行,如下所示:
if [ 0 -lt 2 -o (0 -gt 3 ) ]
这会产生错误:
line 3: syntax error near unexpected token `('
所以我看了man test
以确保支持parens,当然,非常靠近手册页的顶部,它们是!什么给了!?
上面的示例与代码不完全匹配,因为我试图清除它以证明一个点,但如果您需要上下文,则为my repo。
编辑:更改了if行以匹配错误。
答案 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