Как проверить синтаксис скрипта Bash без его запуска? - PullRequest
239 голосов
/ 05 октября 2008

Можно ли проверить синтаксис bash-скрипта, не выполняя его?

Используя Perl, я могу запустить perl -c 'script name'. Есть ли какая-нибудь эквивалентная команда для скриптов bash?

Ответы [ 7 ]

343 голосов
/ 05 октября 2008
bash -n scriptname

Возможно, очевидное предостережение: это проверяет синтаксис, но не проверяет, пытается ли ваш bash-скрипт выполнить команду, которой нет в вашем пути, например ech hello вместо echo hello.

110 голосов
/ 24 октября 2013

Время меняет все. Вот веб-сайт , который предоставляет онлайн-проверку синтаксиса сценария оболочки.

Я обнаружил, что это очень мощное средство обнаружения распространенных ошибок.

enter image description here

О ShellCheck

ShellCheck - это инструмент статического анализа и линтинга для скриптов sh / bash. Он в основном сосредоточен на обработке типичных синтаксических ошибок начального и промежуточного уровня и ловушек, когда оболочка просто дает загадочное сообщение об ошибке или странном поведении, но также сообщает о нескольких более сложных проблемах, когда в угловых случаях могут возникать отложенные сбои.

Исходный код на Haskell доступен на GitHub!

37 голосов
/ 23 мая 2012

Я также включаю опцию 'u' в каждом скрипте bash, который я пишу для дополнительной проверки:

set -u 

Это сообщит об использовании неинициализированных переменных, как в следующем скрипте 'check_init.sh'

#!/bin/sh
set -u
message=hello
echo $mesage

Запуск скрипта:

$ check_init.sh

сообщит следующее:

. / Check_init.sh [4]: ​​mesage: параметр не задан.

Очень полезно ловить опечатки

22 голосов
/ 02 февраля 2011
sh  -n   script-name 

Запустите это. Если в скрипте есть какие-либо синтаксические ошибки, он возвращает то же сообщение об ошибке. Если ошибок нет, то выходит без сообщения. Вы можете проверить сразу, используя echo $?, который вернет 0, подтвердив успешное без ошибок.

У меня это хорошо сработало. Я работал на ОС Linux, Bash Shell.

4 голосов
/ 03 августа 2017

Я фактически проверяю все скрипты bash в текущем каталоге на наличие синтаксических ошибок БЕЗ их запуска с использованием инструмента find:

Пример:

find . -name '*.sh' -exec bash -n {} \;

Если вы хотите использовать его для одного файла, просто отредактируйте шаблон с именем файла.

3 голосов
/ 17 января 2014

нулевая команда [двоеточие] также полезна при отладке, чтобы увидеть значение переменной

set -x
for i in {1..10}; do
    let i=i+1
    : i=$i
done
set - 
1 голос
/ 05 декабря 2015

Существует Плагин BashSupport для IntelliJ IDEA , который проверяет синтаксис.

...