Можно ли проверить синтаксис bash script без его выполнения?
Используя Perl, я могу запустить perl -c 'script name'
. Есть ли эквивалентная команда для скриптов bash?
bash -n scriptname
Возможно, очевидная оговорка: это подтверждает синтаксис, но не проверяет, пытается ли ваш bash script выполнить команду, которая не находится в вашем пути, например ech hello
вместо echo hello
.
set
.
Время меняет все. Вот веб-сайт, который обеспечивает онлайн-проверку синтаксиса для оболочки script.
Я обнаружил, что он очень сильно обнаруживает распространенные ошибки.
ShellCheck - это инструмент статического анализа и литья для скриптов sh/bash. В основном это касалось обработки типичных ошибок синтаксиса начального и промежуточного уровней и ошибок, когда оболочка просто дает загадочное сообщение об ошибке или странное поведение, но также сообщает о нескольких более сложных проблемах, когда угловые случаи могут вызывать задержки с ошибками.
Исходный код Haskell доступен на GitHub!
shellcheck
, shellcheck
, через Homebrew : brew install shellcheck
.
apt-get install shellcheck
Я также включаю опцию 'u' на каждом bash script, который я пишу, чтобы выполнить дополнительную проверку:
set -u
Это сообщит об использовании неинициализированных переменных, как в следующем script 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Запуск script:
$ check_init.sh
Сообщает следующее:
./check_init.sh [4]: mesage: параметр не установлен.
Очень полезно улавливать опечатки
set -u
хотя это на самом деле не отвечает на вопрос, потому что вы должны запустить скрипт, чтобы получить сообщение об ошибке. Даже bash -n check_init.sh
показывает это предупреждение
sh -n script-name
Запустите это. Если в script есть какие-либо синтаксические ошибки, он возвращает то же сообщение об ошибке.
Если ошибок нет, тогда он выходит без сообщения. Вы можете сразу проверить, используя echo $?
, который вернет 0
подтверждение успешности без какой-либо ошибки.
Это сработало для меня хорошо. Я работал в ОС Linux, Bash Shell.
Команда null [двоеточие] также полезна при отладке, чтобы увидеть значение переменной
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
Существует плагин BashSupport для IntelliJ IDEA, который проверяет синтаксис.
.sh
или другое расширение, связанное со скриптами Bash, что имеет место, если вы генерируете скрипты, используя какой-либо шаблонизатор, такой как ERB (тогда они заканчиваются на .erb
). Пожалуйста, проголосуйте за youtrack.jetbrains.com/issue/IDEA-79574, если хотите, чтобы это было исправлено!
Я действительно проверяю все сценарии bash в текущем каталоге для синтаксических ошибок БЕЗ запуска их с помощью инструмента find
:
Пример:
find . -name '*.sh' -exec bash -n {} \;
Если вы хотите использовать его для одного файла, просто отредактируйте подстановочный знак с именем файла.