Bash で変数が設定されているかどうかを確認するにはどうすればよいですか?
たとえば、ユーザーが関数に最初のパラメータを指定したかどうかをどのように確認すればよいでしょうか?
function a {
# if $1 is set ?
}
ベストアンサー1
(通常は)正しい方法
if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi
どこに${var+x}
ありますかパラメータ拡張設定されていない場合は何も評価されずvar
、それ以外の場合は文字列が置き換えられますx
。
引用 余談
引用符は省略できます (つまり、${var+x}
の代わりに と記述できます"${var+x}"
)。これは、この構文と使用法により、引用符を必要としない何かにのみ展開されることが保証されるためです (これは に展開されるかx
(単語の区切りがないため引用符は不要)、または何も展開されないかのいずれかになります ( となり[ -z ]
、これは と同じ値 (true) に評価されるため便利[ -z "" ]
です))。
しかし、引用符は安全に省略できますが、それは誰にとってもすぐには明らかではありませんでした(この引用文の最初の著者主要な Bash コーダーでもある著者によると、[ -z "${var+x}" ]
O(1) の速度ペナルティというわずかなコストで、 のように引用符を使用してソリューションを記述する方がよい場合があります。最初の著者は、このソリューションを使用するコードの横に、この回答の URL を示すコメントとしてこれを追加しました。この回答には、引用符を省略しても問題ない理由の説明も含まれています。
(多くの場合)間違った方法
if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi
これは、設定されていない変数と空の文字列に設定されている変数を区別しないため、多くの場合間違っています。つまり、 の場合var=''
、上記のソリューションは「var is blank」を出力します。
設定解除と「空の文字列に設定」の区別は、ユーザーが拡張子または追加のプロパティ リストを指定する必要があり、それらを指定しないとデフォルトで空でない値に設定されるのに対し、空の文字列を指定すると、スクリプトは空の拡張子または追加のプロパティ リストを使用する必要がある状況では重要です。
ただし、すべてのシナリオでこの区別が必須というわけではありません。その場合は[ -z "$var" ]
問題ありません。