关于脚本:bash shell脚本语法错误

bash shell script syntax error

本问题已经有最佳答案,请猛点这里访问。

我用bash脚本编写了一个函数。但是,它在抱怨语法。我真的看不见是什么……错误消息为[:缺少"]"

1
2
3
4
5
6
7
8
9
10
11
addem() {
            if [ $# -eq 0] || [ $# -gt 2 ]
            then
                    echo -1
            elif [ $# -eq 1 ]
            then
                    echo $[ $1 + $1 ]
            else
                    echo $[ $1 + $2 ]
            fi
    }

在第一个]之前需要一个空间。即:
更改:
if [ $# -eq 0] || [ $# -gt 2 ]
收件人:
埃多克斯1〔2〕


尝试:

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

(0和之间没有空格。)


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

Joakim Elofsson:if语句的总体结构正确,只有在"then"之前和"fi"之前才需要";",如果这些语句没有单独列出。

问题是"0"和括号之间的空间。bash要求用于分隔条件表达式的括号至少与表达式之间有一个空格。

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

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

另外,可以组合这两个条件表达式。运营商协会将确保一切顺利进行。

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

我倾向于使用带有双括号的扩展功能来进行表达式评估。请注意,两个评估的组合是用不同的运算符完成的。我觉得这个更易读。

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

在脚本后面,不建议使用单括号进行整数加法。单括号将表达式计算为布尔值。双parens用于整数数学。

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

                echo $(( $1 + $1 ))   # Integer math


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

1
2
3
4
5
6
7
8
9
10
11
addem() {
        if (( $# == 0 || $# > 2 ))
        then
                echo -1
        elif (( $# == 1 ))
        then
                echo (( $1 + $1 ))
        else
                echo (( $1 + $2 ))
        fi
 }


bash对空间很敏感。在第一行中,将if[y-eq x]替换为[y-eq x](在"]"之前的空格)


您应该避免使用括号,而是使用test

1
2
3
4
5
6
7
8
9
if test $# -eq 0 || test $# -gt 2
then
    echo -1
elif test $# -eq 1
then
    echo $(( $1 + $1 ))
else
    echo $(( $1 + $2 ))
fi

获得一个更好的贝壳风格会使你更好。:)