Можно ли проверить синтаксис 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» в зависимости от ваших потребностей