Синтаксическая ошибка сценария 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
Получение лучшего стиля оболочки сделает вас намного лучше.:)