環境変数を空の文字列に設定することと設定を解除することに違いはありますか?

環境変数を空の文字列に設定することと設定を解除することに違いはありますか?

環境変数の設定を解除することと空の文字列に設定することに実質的な違いはありますか?

答え1

各アプリケーションは、設定されていない変数と空の変数を同じまたは異なるように解釈できます。異なる意味を与えることは一般的に悪い考えであり、ほとんどのアプリケーションではこれを行いませんが、実際には起こります。

シェル自体の例は次のとおりです。IFS シェル変数(通常は環境にエクスポートされませんが、同じ原則が適用されます。)設定しないと、シェルはこの値が同じように動作します$' \t\n'

シェルスクリプトでは、null に設定されているかどうかに関係なく、空の$foo文字列に展開されます。foo以下からシェルを実行できます。nounset設定(set -uまたはset -o nounset)。この場合、設定されていない変数を拡張しようとすると、シェルはエラーを報告して終了します。それ以外の場合は、次のように設定されていない変数と空の変数を区別できます。パラメータ拡張修飾子:設定されていないか空の場合は空の文字列に展開され${foo:+a}、それ以外の場合は空の文字列に展開され、設定されていても空の文字列に展開されます。afoo${foo+a}afoo

答え2

はい、違いがあります。しかし、空の文字列と未設定の変数を評価することは同じであるため、これは非常に微妙です。

$ env - FOO= sh -c 'echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XxX
FOO=
PWD=/tmp
$ env - FOO= sh -c 'unset FOO; echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XX
PWD=/tmp

どちらも${FOO:+x}空の文字列として評価されます。ただし、${FOO+x}FOOが空の文字列の場合は「x」と評価されます。

私がよく使うことの1つは、$DEBUG環境変数を設定してから${DEBUG+true}プログラムで使用することです。その後、空の文字列を含むDEBUGを何でも設定できます。

PerlやPythonなどの高度な言語では、これは ""とundef(Perl)またはNone(Python)の違いです。

答え3

Bashスクリプトは以下を区別できます。

  • (環境)変数が設定されていません。
  • 変数が空に設定
  • 空の文字列に設定された変数

「デフォルトのフォールバック」を処理する可能性が高いため、一般的にこれら3つのケースに違いはありません。エンコーダは、見つかった最初の方法のみを使用する傾向があります。数基本代替処理このように:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.
FOO=${VARIABLE:+default}  # If variable is set use, use default.

# all replacing commands an be used also without ':', so it handles null cases differently
FOO=${VARIABLE-default}  # If variable not set, use default.

# somewhat also used in wild using "test" (see man test"
[[ -z "$FOO" ]] && FOO="defoltíček : "

私は変数に空の文字列を使用する可能性を維持することを好むので、主に次のアプローチを使用します。

DEFAULT_INTERFACE=$(ip addr show | awk '/inet.*brd/{print $NF; exit}')

INTERFACE_TO_USE=${IFACE=$DEFAULT_INTERFACE}

注:IFACE=コマンドを使用すると、環境変数が設定解除されます。IFACE=""変数を空の文字列に設定するために使用されます。

同様のトピックも参照してくださいhttps://stackoverflow.com/questions/2013547/designing-default-values-to-shell-variables-with-a-single-command-in-bashそして明示的な空の文字列に展開するように変数を設定しますか?

関連情報