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

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

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

Ответ 1

bash -n scriptname

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

Ответ 2

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

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

enter image description here

О ShellCheck

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

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

Ответ 3

Я также включаю опцию '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

sh  -n   script-name 

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

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

Ответ 5

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

Пример:

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

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

Ответ 6

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

set -x
for i in {1..10}; do
    let i=i+1
    : i=$i
done
set - 

Ответ 8

Чтобы выполнить проверку на наличие 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" в зависимости от ваших потребностей