1. ホーム
  2. bash

[解決済み] Bashで変数が設定されているかどうかを確認する方法は?

2022-03-15 21:33:01

質問

Bashで変数が設定されているかどうかを知るにはどうすればよいですか?

例えば、ユーザーがある関数の最初のパラメータを与えたかどうかを確認するにはどうすればよいですか?

function a {
    # if $1 is set ?
}

解決方法は?

(通常) 正しい方法

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 "" ] もそうです))。

しかし、引用符は安全に省略することができ、すべての人にすぐにわかるものではありませんでしたが(それは この引用の説明の最初の著者は のように引用符で囲んで解答を書いた方が良い場合があります。 [ -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" を出力します。

unset と "set to empty string" の区別は、ユーザーが拡張機能や追加プロパティのリストを指定しなければならない状況で、それらを指定しないと空でない値がデフォルトとなり、一方、空文字列を指定するとスクリプトが空の拡張機能や追加プロパティのリストを使用するようになるため、重要です。

しかし、この区別はすべてのシナリオで必須とは限りません。そのような場合には [ -z "$var" ] がちょうどよいでしょう。