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