Bash shell script синтаксическая ошибка

Я написал функцию в bash script. Однако он жалуется на синтаксис. Я действительно не вижу, что это такое... сообщение об ошибке [: missing `] '

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

Ответ 1

Вам нужно пространство перед первым ]. То есть:
изменение:
if [ $# -eq 0] || [ $# -gt 2 ]
в:
if [ $# -eq 0 ] || [ $# -gt 2 ]

Ответ 2

Try:

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

(Между 0 и] не было места.)

Ответ 3

indyK1ng: "#" не рассматривается как комментарий, так как "$" выходит за следующий символ. "$ #" - внутренняя переменная, представляющая число позиционных параметров, существующих в текущем контексте. Это можно рассматривать как количество аргументов командной строки для оболочки script, но этот массив может быть reset с использованием встроенного встроенного [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

Позже в script использование одиночных скобок для целочисленного добавления не рекомендуется. Единичные скобки вычисляют выражение в булевом. Двойные парсеры используются для целочисленной математики.

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

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

Ответ 4

Bash чувствителен к пробелам. В первой строке замените if [Y -eq X] на [Y -eq X] (пробел перед "]" )

Ответ 5

Я бы использовал расширенные тестовые конструкции (BASH), как показано ниже. Я думаю, что это уменьшит количество символов и повысит читаемость (по крайней мере, для программистов).: -)

addem() { 
        if (( $# == 0 || $# > 2 )) 
        then 
                echo -1 
        elif (( $# == 1 )) 
        then 
                echo (( $1 + $1 )) 
        else 
                echo (( $1 + $2 ))
        fi 
 }

Ответ 6

Вам следует избегать скобок и вместо этого использовать test:

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

Получение лучшего стиля оболочки сделает вас намного лучше.:)