Синтаксическая ошибка сценария bash

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

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

6 ответов

Решение

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

Пытаться:

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

(Между 0 и] не было пробела.)

indyK1ng: "#" не рассматривается как комментарий, так как "$" экранирует следующий символ. "$#" - это внутренняя переменная, представляющая количество позиционных параметров, существующих в текущем контексте. Это можно рассматривать как количество аргументов командной строки для сценария оболочки, но этот массив можно сбросить с помощью встроенного "set - [args]".

Йоаким Элофссон: Общая структура оператора 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

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

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

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

Вы должны избегать скобок и использовать test вместо:

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

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

Другие вопросы по тегам