Как проверить синтаксис скрипта Bash без его запуска?

187

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

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

Теги:
syntax
gnu

7 ответов

300
Лучший ответ
bash -n scriptname

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

  • 1
    Спасибо за совет, я определенно буду использовать этот. Странно, но эта опция не указана в справочной странице bash: S ...
  • 9
    На man-странице bash в разделе «КОМАНДЫ / НАСТРОЙКИ ОБОЛОЧКИ ОБЪЕКТА» задокументирована -n, и, как указано в начале man-страницы, bash интерпретирует все односимвольные опции, которые set .
Показать ещё 9 комментариев
72

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

Я обнаружил, что он очень сильно обнаруживает распространенные ошибки.

Изображение 3910

О ShellCheck

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

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

  • 4
    Отличный совет; в OSX теперь вы также можете установить CLI shellcheck , shellcheck , через Homebrew : brew install shellcheck .
  • 2
    Также на Debian и в друзьях: apt-get install shellcheck
Показать ещё 4 комментария
35

Я также включаю опцию '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: параметр не установлен.

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

  • 4
    я всегда устанавливаю эти флаги в своих скриптах bash, если они проходят, хорошо идти "set -o errexit" "set -o nounset" "set -o pipefail"
  • 0
    +1 для set -u хотя это на самом деле не отвечает на вопрос, потому что вы должны запустить скрипт, чтобы получить сообщение об ошибке. Даже bash -n check_init.sh показывает это предупреждение
22
sh  -n   script-name 

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

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

  • 3
    +1 для проверки возвращаемого значения.
  • 1
    Хотя это не совсем относится к проверке синтаксиса bash - использование set -x и set + x для отладки полного скрипта или его частей довольно полезно
Показать ещё 2 комментария
3

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

set -x
for i in {1..10}; do
    let i=i+1
    : i=$i
done
set - 
  • 0
    Как это работает?
  • 0
    использовать расширения параметров
Показать ещё 1 комментарий
1

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

  • 0
    Но это не сработает, если ваши файлы не заканчиваются на .sh или другое расширение, связанное со скриптами Bash, что имеет место, если вы генерируете скрипты, используя какой-либо шаблонизатор, такой как ERB (тогда они заканчиваются на .erb ). Пожалуйста, проголосуйте за youtrack.jetbrains.com/issue/IDEA-79574, если хотите, чтобы это было исправлено!
0

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

Пример:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню