Ответ 1
Вам нужно пространство перед первым ]
. То есть:
изменение: if [ $# -eq 0] || [ $# -gt 2 ]
в: if [ $# -eq 0 ] || [ $# -gt 2 ]
Я написал функцию в bash script. Однако он жалуется на синтаксис. Я действительно не вижу, что это такое... сообщение об ошибке [: missing `] '
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 ]
в: if [ $# -eq 0 ] || [ $# -gt 2 ]
Try:
if [ $# -eq 0 ] || [ $# -gt 2 ]
(Между 0 и] не было места.)
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
Bash чувствителен к пробелам. В первой строке замените if [Y -eq X] на [Y -eq X] (пробел перед "]" )
Я бы использовал расширенные тестовые конструкции (BASH), как показано ниже. Я думаю, что это уменьшит количество символов и повысит читаемость (по крайней мере, для программистов).: -)
addem() {
if (( $# == 0 || $# > 2 ))
then
echo -1
elif (( $# == 1 ))
then
echo (( $1 + $1 ))
else
echo (( $1 + $2 ))
fi
}
Вам следует избегать скобок и вместо этого использовать test
:
if test $# -eq 0 || test $# -gt 2
then
echo -1
elif test $# -eq 1
then
echo $(( $1 + $1 ))
else
echo $(( $1 + $2 ))
fi
Получение лучшего стиля оболочки сделает вас намного лучше.:)