web-dev-qa-db-ja.com

魚の殻。変数が設定されている/空であるかどうかを確認する方法は?

どうすればいいですか

set variable (some_command_that_may_return_a_string)
if [ variable is set ]
    do_something

逆に、変数が空かどうかを確認するにはどうすればよいですか?

23
Adam Zahran
  • set -q var(「$」がないことに注意-これは変数nameを使用します)は、変数が設定されているかどうかを確認するために使用できます。

  • set -q var[1]は、変数の最初の要素が割り当てられているかどうか(つまり、リストとして空ではないかどうか)を確認するために使用できます。

  • test -n "$var" [fn0](または[ -n "$var" ])を使用して、変数が空でない文字列(およびtest -zは逆です-空の場合はtrue)。

これらは、わずかに異なる状況で真/偽になります。

set varはまったく実行されており(親プロセスから継承されていない)、set -q varset -q var[1]およびtest -n "$var"はfalse、test -z "$var"は真になります。

set varが行われた(追加の引数なし)、set -q varは真、set -q var[1]はfalseになります。

set var ""が完了しました。両方のsetバージョンがtrueになります。

set var "somestring" (あるいは set var "" "" [fn1])が行われた場合、setsはtrueになり、test -z "$var"はfalseになります。


[fn0]:あなたnevertest(または[)変数を引用符で囲まずに。特にひどい例として、test -n $varは、変数に何かが含まれている場合と、リストが空または未設定の場合(setがまったくない場合またはset var引数なし)。これは、魚のtestがPOSIXに続く数少ないパーツの1つであり、任意の1つの引数を持つtestがtrueであることを要求するためです。また、リストを適切に処理しません-test -n $varは、varに複数の要素がある場合、奇妙な結果になります。

[fn1]:これは、要素をスペースで結合することによりリストが文字列として展開されるため、2つの空の文字列で構成されるリストが「」-1つのスペースに展開されるためです。空ではないので、test -zはfalseを返します。

34
faho