2009-06-23 5 views
0

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

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

ответ

12

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

+4

Немного истории: это потому, что '[' был исторически не встроенным в оболочку, а отдельным исполняемым файлом, который получил выражение в качестве аргументов и вернул результат.Если вы не окружаете «[» пробелом, оболочка будет искать $ PATH для другого имени файла (и не найдет его). –

3

Try:

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

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

1

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

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 

Получение better shell style сделает вас намного лучше. :)

+0

Нет, вы должны использовать двойные скобки вместо тестовых или одиночных скобок. –

2

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

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

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

почему обратные ссылки? – ghostdog74

+0

Спасибо за исправление. Мне интересно, как это получилось. – Jayan

Смежные вопросы