Чи можна перевірити синтаксис bash script, не виконуючи його?
Використовуючи Perl, я можу працювати perl -c 'script name'
. Чи є еквівалентна команда для bash-скриптів?
Чи можна перевірити синтаксис bash script, не виконуючи його?
Використовуючи Perl, я можу працювати perl -c 'script name'
. Чи є еквівалентна команда для bash-скриптів?
Відповіді:
bash -n scriptname
Можливо, очевидний застереження: це перевіряє синтаксис, але не перевірить, чи ваш скрипт bash намагається виконати команду, яка не знаходиться на вашому шляху, як ech hello
замість echo hello
.
set
.
if ["$var" == "string" ]
а неif [ "$var" == "string" ]
type [
каже "[вбудована оболонка". В кінцевому рахунку він делегує test
програмі, але також очікує закриття дужки. Так це, як if test"$var"
це не те, що мав на увазі автор, але синтаксично допустиме (скажімо, у $ var є значення "a", тоді ми побачимо "bash: testa: команда не знайдена"). Справа в тому, що в синтаксичному плані немає місця.
[
У цьому випадку Builtin викликається лише в тому випадку, якщо $var
розшириться до порожнього рядка . Якщо $var
розширюється на не порожню рядок, [
вона об'єднується з цією рядком і інтерпретується як ім'я команди (не ім'я функції ) Bash, і, так, це синтаксично дійсно, але, як ви заявляєте, очевидно, не наміром. Якщо ви використовуєте [[
замість [
, хоча [[
це ключове слово оболонки (а не вбудований), ви отримаєте той самий результат, оскільки ненавмисна конкатенація рядків все ж перекриває розпізнавання ключового слова.
["$var"
є синтаксичний допустимим ім'ям команди вираження; Аналогічно, лексеми ==
та "$string"
дійсні аргументи команди . ( Як правило, вбудований [
розбираються з командою синтаксисом, тоді [[
- як оболонка ключовим слова - аналізуються по- різному.) Вбудована команда оболонки [
ніяк НЕ делегує на « test
програму» (зовнішня утиліта): bash
, dash
, ksh
, zsh
всі вони мають вбудовану команду версії як [
іtest
, і вони не називають своїх зовнішніх комунальних аналогів.
Час все змінює. Ось веб-сайт, який забезпечує перевірку синтаксису в Інтернеті для сценарію оболонки.
Я виявив, що це дуже потужне виявлення поширених помилок.
ShellCheck - це інструмент для статичного аналізу та зв'язування для скриптів sh / bash. Основна увага зосереджена на обробці типових помилок синтаксису для початківців та проміжних рівнів, де оболонка просто дає критичне повідомлення про помилку або дивну поведінку, але також повідомляє про ще кілька вдосконалених питань, коли кутові випадки можуть спричинити затримки відмов.
Вихідний код Haskell доступний на GitHub!
apt-get install shellcheck
trusty-backports
.
Я також вмикаю опцію 'u' для кожного сценарію bash, який я пишу, щоб зробити додаткову перевірку:
set -u
Це повідомить про використання неініціалізованих змінних, як у наступному скрипті "check_init.sh"
#!/bin/sh
set -u
message=hello
echo $mesage
Запуск сценарію:
$ check_init.sh
Повідомлять про наступне:
./check_init.sh evidence4]: повідомлення: Параметр не встановлено.
Дуже корисно ловити помилки
set -u
хоча це насправді не відповідає на питання, оскільки вам потрібно запустити сценарій, щоб отримати повідомлення про помилку. Навіть не bash -n check_init.sh
видно, що попередження
sh -n script-name
Виконати це. Якщо в скрипті є якісь синтаксичні помилки, то він повертає те саме повідомлення про помилку. Якщо помилок немає, то воно виходить, не даючи жодного повідомлення. Ви можете перевірити негайно, використовуючи echo $?
, що повернеться0
підтвердження успішного без будь-якої помилки.
Це працювало для мене добре. Я працював на ОС Linux, Bash Shell.
sh -n
напевно не перевірять, чи справжній сценарій Bash-скрипт. Це може дати помилкові негативи. sh
- це варіант оболонки Борна, який зазвичай не є Bash. Наприклад, Ubuntu Linux realpath -e $(command -v sh)
дає / bin / dash
Я фактично перевіряю всі скрипти bash у поточному реєстрі на наявність синтаксичних помилок БЕЗ запускання їх за допомогою find
інструменту:
Приклад:
find . -name '*.sh' -exec bash -n {} \;
Якщо ви хочете використовувати його для одного файлу, просто відредагуйте підстановку з назвою файлу.
Існує плагін BashSupport для IntelliJ IDEA, який перевіряє синтаксис.
.sh
або іншим розширенням, пов’язаним зі сценаріями Bash, це так, якщо ви генеруєте сценарії за допомогою якогось інструменту для створення шаблонів, такого як ERB (тоді вони закінчуються .erb
). Будь ласка, голосуйте за youtrack.jetbrains.com/issue/IDEA-79574, якщо ви хочете, щоб це було виправлено!
Якщо вам потрібна змінна дійсність усіх файлів у каталозі (git попередньо здійснити гак, побудувати скрипт lint), ви можете впізнати більш жорсткий вихід команд "sh -n" або "bash -n" (див. Інші відповіді) у змінній та мають на основі цього "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" залежно від ваших потреб