回答:
bash -n scriptname
おそらく明らかな警告です:これは構文を検証しますが、bashスクリプトがパスではech hello
なく、などのコマンドを実行しようとしているかどうかはチェックしませんecho hello
。
set
します。
if ["$var" == "string" ]
代わりに、欠落しているスペースによって引き起こされるエラーをキャッチしませんif [ "$var" == "string" ]
type [
「[はシェル組み込みです」と言います。最終的にはtest
プログラムに委任されますが、終了括弧も必要です。したがってif test"$var"
、これは作成者が意図したものではありませんが、構文的には有効です($ varの値が "a"であるとすると、 "bash:testa:command not found"と表示されます)。ポイントは、構文的には、欠けているスペースがないということです。
[
この場合、$var
たまたま空の文字列に展開された場合にのみ、組み込みが呼び出されます。場合$var
に膨張し、空でない文字列が、[
された連結その文字列とし、として解釈され、コマンド名(ない関数バッシュで名)、および、はい、それは構文的に有効な、しかし、明らかにあなたの状態、意図するところではないとして。の[[
代わりにを使用すると[
、(組み込みではなく)[[
シェルキーワードであっても、意図しない文字列の連結によってキーワードの認識が上書きされるため、同じ結果が得られます。
["$var"
ある 構文的に有効なコマンド名の発現; 同様に、トークン==
とは、"$string"
有効なコマンドです引数。(一般的には、組み込みが[
で解析されたコマンドに対し、構文[[
-シェルとしてキーワード -異なった解析されます。)シェル組み込みが[
ないではない 委任「にtest
プログラム」(外部ユーティリティ): 、bash
、、dash
すべて持っている組み込みの両方のバージョンとksh
zsh
[
test
、そして彼らは外部ユーティリティの対応物を呼び出しません。
時間はすべてを変える。これは、シェルスクリプトのオンライン構文チェックを提供するWebサイトです。
一般的なエラーの検出は非常に強力であることがわかりました。
ShellCheckは、sh / bashスクリプト用の静的分析およびリンティングツールです。これは主に、典型的な初級および中級レベルの構文エラーと、シェルが不可解なエラーメッセージまたは奇妙な動作を提供する落とし穴を処理することに焦点を当てていますが、コーナーケースが遅延障害を引き起こす可能性があるいくつかのより高度な問題についても報告します。
HaskellのソースコードはGitHubで入手できます!
apt-get install shellcheck
trusty-backports
。
また、追加のチェックを行うために、作成するすべてのbashスクリプトで 'u'オプションを有効にします。
set -u
これは、次のスクリプト「check_init.sh」のように、初期化されていない変数の使用を報告します
#!/bin/sh
set -u
message=hello
echo $mesage
スクリプトを実行する:
$ check_init.sh
以下を報告します:
./check_init.sh[4]:mesage:パラメータが設定されていません。
タイプミスを見つけるのに非常に役立ちます
set -u
エラーメッセージを取得するにはスクリプトを実行する必要があるため、+ 1 は実際には質問の答えにはなりません。bash -n check_init.sh
その警告さえ示していません
sh -n script-name
これを実行します。スクリプトに構文エラーがある場合は、同じエラーメッセージが返されます。エラーがなければ、メッセージを出さずに出てきます。を使用するとecho $?
、すぐに0
確認でき、間違いなく成功したことを確認できます。
うまくいきました。Linux OS、Bash Shellで実行しました。
sh -n
おそらく、スクリプトが有効なBashスクリプトであることを確認しません。それは偽陰性を与えるかもしれません。sh
通常はBashではないBourneシェルの変種です。たとえば、Ubuntu Linuxではrealpath -e $(command -v sh)
/ bin / dash
私は実際に、find
ツールを使用して実行せずに、現在のディレクトリ内のすべてのbashスクリプトに構文エラーがないかチェックします。
例:
find . -name '*.sh' -exec bash -n {} \;
単一のファイルに使用する場合は、ファイルの名前でワイルドカードを編集します。
構文をチェックするIntelliJ IDEA用のBashSupportプラグインがあります。
.sh
Bashスクリプトに関連付けられている拡張子やその他の拡張子がない場合は機能しません。これは、ERBなどのテンプレートツールを使用してスクリプトを生成する場合に該当します(その後、で終了します.erb
)。修正したい場合は、youtrack.jetbrains.com / issue / IDEA-79574に投票してください!
変数にディレクトリ内のすべてのファイルの有効性が必要な場合(git pre-commitフック、ビルドlintスクリプト)、「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」に変更します