Bashスクリプトの構文を実行せずにチェックすることは可能ですか?
Perlを使用すると、Perl -c 'script name'
を実行できます。 bashスクリプトに同等のコマンドはありますか?
bash -n scriptname
おそらく明らかな警告:これは構文を検証しますが、bashスクリプトがech hello
ではなくecho hello
のようなパスにないコマンドを実行しようとしているかどうかをチェックしません。
時間はすべてを変えます。 こちらはWebサイトです シェルスクリプトのオンライン構文チェックを提供します。
一般的なエラーを検出するのに非常に強力であることがわかりました。
ShellCheck は、sh/bashスクリプト用の静的分析およびリンティングツールです。主に、シェルが不可解なエラーメッセージまたは奇妙な動作を与える典型的な初心者および中級の構文エラーと落とし穴の処理に焦点を当てていますが、コーナーケースが遅延障害を引き起こす可能性があるいくつかのより高度な問題についても報告します。
HaskellのソースコードはGitHubで入手できます!
また、追加のチェックを行うために、作成するすべてのbashスクリプトで「u」オプションを有効にします。
set -u
これは、次のスクリプト「check_init.sh」のように、初期化されていない変数の使用を報告します
#!/bin/sh
set -u
message=hello
echo $mesage
スクリプトの実行:
$ check_init.sh
以下を報告します。
./check_init.sh[4]:mesage:パラメーターが設定されていません。
タイプミスをキャッチするのに非常に便利
__コードスニペット__
これを実行します。スクリプトに構文エラーがある場合、同じエラーメッセージが返されます。エラーがない場合は、メッセージを表示せずに出力されます。 sh -n script-name
を使用してすぐに確認できます。echo $?
は、0
を返し、エラーがないことを確認します。
うまくいきました。 Linux OS、Bash Shellで実行しました。
find
ツールを使用して実行せずに、現在のディレクトリにあるすべてのbashスクリプトを実際に構文エラーをチェックします。
例:
find . -name '*.sh' -exec bash -n {} \;
単一のファイルに使用する場合は、ファイルの名前でワイルドカードを編集するだけです。
nullコマンド[コロン]は、変数の値を確認するためにデバッグする場合にも役立ちます。
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
構文をチェックする IntelliJ IDEA には BashSupportプラグイン があります。
変数にディレクトリ内のすべてのファイルの有効性が必要な場合(git pre-commit hook、build lint script)、「sh -n」または「bash -n」コマンドの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」に変更します