web-dev-qa-db-ja.com

Bashスクリプトを実行せずに構文チェックするにはどうすればよいですか?

Bashスクリプトの構文を実行せずにチェックすることは可能ですか?

Perlを使用すると、Perl -c 'script name'を実行できます。 bashスクリプトに同等のコマンドはありますか?

239
Tom Feiner
bash -n scriptname

おそらく明らかな警告:これは構文を検証しますが、bashスクリプトがech helloではなくecho helloのようなパスにないコマンドを実行しようとしているかどうかをチェックしません。

343
andy

時間はすべてを変えます。 こちらはWebサイトです シェルスクリプトのオンライン構文チェックを提供します。

一般的なエラーを検出するのに非常に強力であることがわかりました。

enter image description here

ShellCheckについて

ShellCheck は、sh/bashスクリプト用の静的分析およびリンティングツールです。主に、シェルが不可解なエラーメッセージまたは奇妙な動作を与える典型的な初心者および中級の構文エラーと落とし穴の処理に焦点を当てていますが、コーナーケースが遅延障害を引き起こす可能性があるいくつかのより高度な問題についても報告します。

HaskellのソースコードはGitHubで入手できます!

111
dvd818

また、追加のチェックを行うために、作成するすべてのbashスクリプトで「u」オプションを有効にします。

set -u 

これは、次のスクリプト「check_init.sh」のように、初期化されていない変数の使用を報告します

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

スクリプトの実行:

$ check_init.sh

以下を報告します。

./check_init.sh[4]:mesage:パラメーターが設定されていません。

タイプミスをキャッチするのに非常に便利

37
Diego Tercero
__コードスニペット__

これを実行します。スクリプトに構文エラーがある場合、同じエラーメッセージが返されます。エラーがない場合は、メッセージを表示せずに出力されます。 sh -n script-name を使用してすぐに確認できます。echo $?は、0を返し、エラーがないことを確認します。

うまくいきました。 Linux OS、Bash Shellで実行しました。

22
Jeevan

findツールを使用して実行せずに、現在のディレクトリにあるすべてのbashスクリプトを実際に構文エラーをチェックします。

例:

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

単一のファイルに使用する場合は、ファイルの名前でワイルドカードを編集するだけです。

4
Gerald Hughes

nullコマンド[コロン]は、変数の値を確認するためにデバッグする場合にも役立ちます。

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

構文をチェックする IntelliJ IDEA には BashSupportプラグイン があります。

1
Cengiz

変数にディレクトリ内のすべてのファイルの有効性が必要な場合(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」に変更します

1
Elvis Ciotti