Можно ли проверить синтаксис bash script без его выполнения?
Используя Perl, я могу запустить perl -c 'script name'
. Есть ли эквивалентная команда для скриптов bash?
Можно ли проверить синтаксис bash script без его выполнения?
Используя Perl, я могу запустить perl -c 'script name'
. Есть ли эквивалентная команда для скриптов bash?
bash -n scriptname
Возможно, очевидная оговорка: это подтверждает синтаксис, но не проверяет, пытается ли ваш bash script выполнить команду, которая не находится в вашем пути, например ech hello
вместо echo hello
.
Время меняет все. Вот веб-сайт, который обеспечивает онлайн-проверку синтаксиса для оболочки script.
Я обнаружил, что он очень сильно обнаруживает распространенные ошибки.
ShellCheck - это инструмент статического анализа и литья для скриптов sh/bash. В основном это касалось обработки типичных ошибок синтаксиса начального и промежуточного уровней и ошибок, когда оболочка просто дает загадочное сообщение об ошибке или странное поведение, но также сообщает о нескольких более сложных проблемах, когда угловые случаи могут вызывать задержки с ошибками.
Исходный код Haskell доступен на GitHub!
Я также включаю опцию '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: параметр не установлен.
Очень полезно улавливать опечатки
sh -n script-name
Запустите это. Если в script есть какие-либо синтаксические ошибки, он возвращает то же сообщение об ошибке.
Если ошибок нет, тогда он выходит без сообщения. Вы можете сразу проверить, используя echo $?
, который вернет 0
подтверждение успешности без какой-либо ошибки.
Это сработало для меня хорошо. Я работал в ОС Linux, Bash Shell.
Я действительно проверяю все сценарии bash в текущем каталоге для синтаксических ошибок БЕЗ запуска их с помощью инструмента find
:
Пример:
find . -name '*.sh' -exec bash -n {} \;
Если вы хотите использовать его для одного файла, просто отредактируйте подстановочный знак с именем файла.
Команда null [двоеточие] также полезна при отладке, чтобы увидеть значение переменной
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
Существует плагин BashSupport для IntelliJ IDEA, который проверяет синтаксис.
Чтобы выполнить проверку на наличие git pre-commit hook или сценария lint (рекурсивная проверка каталогов), вы можете перехватить вывод команды stderr в переменной и получить "if/else", основываясь на правильности всех файлов.
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" в зависимости от ваших потребностей