2016-12-07 12 views
7

注:このサイトで単一のシェル変数をテストする方法については、多くの質問があります。この質問は、未定義の変数のスクリプトをテストすることに関するものです。bashで未定義の変数をエラーとして扱うにはどうすればよいですか?

あなたは実行時エラーを見ずにbashで未定義の変数を使用することができます。

#!/bin/bash 

echo ${UNDEF_FILE} 
ls -l ${UNDEF_FILE} 

exit 0 

私はこの非常にエラーが発生しやすいことがわかりました。大きなスクリプトで変数の名前を変更したり、その変数を削除したい場合は、以前のすべての古い参照がスクリプトにエラーを引き起こします。ときどきこれはデバッグするのが明白でないか、または遅すぎることがわかります。

これはなぜ許可されていますか?未定義の変数にフラグを立てる方法はありますか?

+0

「なぜ」は1970年代のシェルとの互換性に戻ります。ベストプラクティスを気にするならば、履歴とは対照的に、スタンドアロンツールとしてダウンロードできるhttp://shellcheck.net/(静的チェック)(https://github.com/koalaman/shellcheck) - ここにあなたの友人です。 –

+1

正に、定義されていない変数の拡張を誤ってしまうと、多くの共通の慣用表現が壊れてしまいます。 '[[$ var]]&{echo" $ varで何かする "; } 'set -u'で壊れます:' set -e'(これはチェックされていない失敗や失敗の条件として使われる)とは異なり、 'set -u'は*すべての*参照を未定義の変数エラー。 –

+0

(ちなみにall-caps変数名は、シェルやオペレーティングシステムにとって意味のある環境変数のためにPOSIXによって定義されたスペースにあります;少なくとも1つの小文字を含む変数の名前空間はアプリケーション用に予約されています。後者を上書きする環境変数で名前を共有するシェル変数を設定するために、環境変数だけでなく、すべてのシェル変数に) –

答えて

9

あなたは使用することができます。

set -u 

スクリプトの開始時に未定義の変数を使用しているときにエラーをスローします。

-u

パラメータ展開を実行するときにエラーとして「@」特別なパラメータ以外の設定解除の変数とパラメータを扱い、「*」。未設定の変数またはパラメータに対して拡張を試みると、シェルはエラーメッセージを出力し、対話型でない場合は、ゼロ以外のステータスで終了します。

+3

...しかし、これの有用性を指摘する価値はある...議論の余地がある:多くの一般的なイディオムは、定義されていない値がヌル文字列に展開されているので、コードは 'set -u'互換性それがそうであることを望んでいる。 –

+2

'set -o nounset'は' set -u'(Bash)と同じ効果があり、それを好む人もいます。 – pjh

+1

'set -u nounset"を使うときに発生する一般的な問題を扱う方法については、[set -o nounset "(http://stackoverflow.com/q/7832080/4154375)を使うときに[bashで変数が設定されているかどうかテストする]を参照してください。 'set -o nounset'です。 – pjh

0

set -uは、より一般的なオプションですが、他の回答者のコメントで指摘したように、劇中set -uで慣用のシェルスクリプトを書く問題があります。別の方法として、特定の変数が設定されていないときにエラーを返すパラメータ拡張を作成する方法があります。

$ echo $foo 

$ echo $? 
0 
$ echo "${foo?:no foo for yoo}" 
bash: foo: :no foo for yoo 
$ echo $? 
1 

このエラーが発生すると、非対話シェルが終了します。これにより、エラー状態が制御フローを未定義の値で継続することを保証する迅速な方法が得られます。 The specは、対話シェルを終了する必要はありませんが、対話シェルであっても、関数内でこのエラーが発生した場合、bashは関数呼び出しから復帰します。

関連する問題