0

我在 bash 脚本中编写了一个函数。但是,它抱怨语法。我真的看不到它是什么.....错误消息是[:缺少`]'

addem() {
            if [ $# -eq 0] || [ $# -gt 2 ]
            then
                    echo -1
            elif [ $# -eq 1 ]
            then
                    echo $[ $1 + $1 ]
            else
                    echo $[ $1 + $2 ]
            fi
    }
4

6 回答 6

12

您需要在第一个]. 即:
更改:
if [ $# -eq 0] || [ $# -gt 2 ]
为:
if [ $# -eq 0 ] || [ $# -gt 2 ]

于 2009-06-23T21:42:58.140 回答
3

尝试:

if [ $# -eq 0 ] || [ $# -gt 2 ]

(0 和 ] 之间没有空格。)

于 2009-06-23T21:40:58.160 回答
2

indyK1ng:“#”不被视为注释,因为“$”转义了下一个字符。“$#”是一个内部变量,表示当前上下文中存在的位置参数的数量。这可以被认为是 shell 脚本的命令行参数的数量,但是可以使用内置的“set -- [args]”重置该数组。

Joakim Elofsson:if 语句的整体结构是正确的,“;” 仅在“then”之前和“fi”之前需要,如果它们没有在单独的行中列出。

问题是“0”和括号之间的空格。Bash 要求用于分隔条件表达式的括号至少在表达式中使用一个空格。

        if [ $# -eq 0] || [ $# -gt 2 ]    # Wrong

        if [ $# -eq 0 ] || [ $# -gt 2 ]    # Correct

另外需要注意的是,这两个条件表达式可以组合使用。运营商协会将确保一切顺利。

        if [ $# -eq 0 -a $# -gt 2 ]   # Even Better

我倾向于更喜欢用双括号提供的扩展功能来进行表达式评估。请注意,这两个评估的组合是使用不同的运算符完成的。我发现这更具可读性。

        if [[ $# -eq 0 || $# -gt 2 ]]   # My preference

稍后在脚本中,不建议使用单括号进行整数加法。单括号将表达式评估为布尔值。双括号用于整数数学。

                echo $[ $1 + $1 ]   # Evaluation of an expression

                echo $(( $1 + $1 ))   # Integer math
于 2009-06-23T22:10:15.387 回答
1

Bash 对空格很敏感。在您的第一行中,将 if [ Y -eq X] 替换为 [ Y -eq X ](“]”之前的空格)

于 2009-06-23T21:41:28.267 回答
1

我将使用扩展测试构造(BASH),如下所示。我认为这会减少字符数并提高可读性(至少对于程序员而言)。:-)

addem() { 
        if (( $# == 0 || $# > 2 )) 
        then 
                echo -1 
        elif (( $# == 1 )) 
        then 
                echo (( $1 + $1 )) 
        else 
                echo (( $1 + $2 ))
        fi 
 }
于 2009-11-25T05:39:24.313 回答
0

您应该避免使用括号并test改用:

if test $# -eq 0 || test $# -gt 2
then
    echo -1
elif test $# -eq 1
then
    echo $(( $1 + $1 ))
else
    echo $(( $1 + $2 ))
fi

获得更好的外壳样式将使您变得更好。:)

于 2009-06-23T21:49:19.717 回答