Можно ли проверить синтаксис bash-скрипта, не выполняя его?
Используя Perl, я могу бегать perl -c 'script name'. Есть ли эквивалентная команда для скриптов bash?
Можно ли проверить синтаксис bash-скрипта, не выполняя его?
Используя Perl, я могу бегать perl -c 'script name'. Есть ли эквивалентная команда для скриптов bash?
Ответы:
bash -n scriptname
Возможно очевидное предостережение: это проверяет синтаксис, но не проверяет, пытается ли ваш bash-скрипт выполнить команду, которой нет в вашем пути, как ech helloвместо echo hello.
set.
if ["$var" == "string" ]вместоif [ "$var" == "string" ]
type [говорит "[это встроенная оболочка". В конечном итоге он делегирует testпрограмме, но также ожидает закрывающую скобку. Таким образом if test"$var", это не то, что имел в виду автор, но синтаксически допустимо (скажем, $ var имеет значение «a», тогда мы увидим «bash: testa: команда не найдена»). Дело в том, что синтаксически нет пропущенного места.
[в этом случае встроенный вызов вызывается только в том случае, если он $varрасширяется до пустой строки . Если $varрасширяется до непустой строки, [как сцепляется с этой строкой и интерпретируются как команда имя (не функция имя) на Bash, и, да, то есть синтаксический действительно, но, как вы заявляете, очевидно , не намерена. Если вы используете [[вместо [, даже если [[это ключевое слово оболочки (а не встроенное), вы получите тот же результат, потому что непреднамеренная конкатенация строк по-прежнему отменяет распознавание ключевого слова.
["$var"является синтаксический допустимым именем команды выражения; Точно так же токены ==и "$string"являются действительными аргументами команды . ( Как правило, встроенный [разбираются с командой синтаксисом, тогда [[- как оболочка ключевым слова - анализируются по- разному.) Встроенная команда оболочки [никак не делегирует на « testпрограмму» (внешняя утилита): bash, dash, ksh, zshвсе они имеют встроенные версии как [иtestи они не называют своих внешних утилитарных аналогов.
Время меняет все. Вот веб-сайт, который обеспечивает онлайн-проверку синтаксиса сценария оболочки.
Я обнаружил, что это очень мощное обнаружение распространенных ошибок.

ShellCheck - это инструмент статического анализа и линтинга для скриптов sh / bash. Он в основном сосредоточен на обработке типичных синтаксических ошибок начального и промежуточного уровня и ловушек, когда оболочка просто дает загадочное сообщение об ошибке или странном поведении, но также сообщает о нескольких более сложных проблемах, где угловые случаи могут привести к задержке сбоев.
Исходный код на Haskell доступен на GitHub!
apt-get install shellcheck
trusty-backports.
Я также включаю опцию 'u' в каждом скрипте bash, который я пишу, чтобы выполнить дополнительную проверку:
set -u
Это сообщит об использовании неинициализированных переменных, как в следующем скрипте 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Запуск скрипта:
$ check_init.sh
Сообщит следующее:
./check_init.sh[4]: mesage: Параметр не задан.
Очень полезно ловить опечатки
set -uхотя это на самом деле не отвечает на вопрос, потому что вы должны запустить скрипт, чтобы получить сообщение об ошибке. Даже не bash -n check_init.shпоказывает, что предупреждение
sh -n script-name
Запустите это. Если в скрипте есть какие-либо синтаксические ошибки, он возвращает то же сообщение об ошибке. Если ошибок нет, то выходит без сообщения. Вы можете проверить сразу с помощью echo $?, который вернет 0подтверждение успешной без каких-либо ошибок.
У меня это хорошо сработало. Я работал на ОС Linux, Bash Shell.
sh -nвероятно, не будет проверять, что скрипт является действительным сценарием Bash. Это может дать ложные негативы. shкакой-то вариант оболочки Bourne, обычно не Bash. Например в Ubuntu Linux realpath -e $(command -v sh)выдает / bin / dash
Я на самом деле проверяю все скрипты bash в текущем каталоге на наличие синтаксических ошибок БЕЗ запуска их с помощью findинструмента:
Пример:
find . -name '*.sh' -exec bash -n {} \;
Если вы хотите использовать его для одного файла, просто отредактируйте шаблон с именем файла.
Существует BashSupport плагин для IntelliJ IDEA , который проверяет синтаксис.
.shили не имеют другого расширения, связанного со скриптами Bash, что имеет место, если вы генерируете скрипты, используя какой-либо шаблонизатор, такой как ERB (тогда они заканчиваются .erb). Пожалуйста, проголосуйте за youtrack.jetbrains.com/issue/IDEA-79574, если хотите, чтобы это было исправлено!
Если вам требуется в переменной допустимость всех файлов в каталоге (git pre-commit hook, build lint script), вы можете получить вывод stderr команд "sh -n" или "bash -n" (см. Другие ответы) в переменной, и иметь «если / еще» на основе этого
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Замените «sh» на «bash» в зависимости от ваших потребностей