シェル(dash)変数のデフォルト値について
これまでなんとなく使っていたのでシェル(dash)変数のデフォルト値についてちゃんと調べました。
効能
読むと以下の違い(:-
,:=
)についてちゃんと説明できるようになります。
${PARAM:-hoge} ${PARAM:=hoge}
実験
man を読んでも今ひとつわからないので、早速実験。
:-
(colon hyphen)
P_HYPHEN= V_HYPHEN=${P_HYPHEN:-hoge} # 実行結果 P_HYPHEN -> V_HYPHEN -> hoge
:=
(colon equal)
P_EQUAL= V_EQUAL=${P_EQUAL:=HOGE} # 実行結果 P_EQUAL -> hoge V_EQUAL -> hoge
結論
ということで、
:=
の方は parameter
にも代入されるのに対し :-
は代入されない、ということでした。
man の
${parameter:-word} Use Default Values.
${parameter:=word} Assign Default Values.
ってそういう違いなのね。 ネイティブ以外には厳しいなぁ。
おまけ
UNSET
と NULL
man を読むと
use of the colon in the format results in a test for a parameter that is unset or null; omission of the colon results in a test for a parameter that is only unset.
と書いてあります。
つまり :
(コロン)を付けるかどうかで挙動が変わるようですね。
ということで実験...
UNSET
V=${UNSET-hoge} echo $V # 実行結果 V -> hoge V=${UNSET:-hoge} echo $V # 実行結果 V -> hoge
と、確かにどちらも使えます。
NULL
NULL= V=${NULL-hoge} echo $V # 実行結果 V -> NULL= V=${NULL:-hoge} echo $V # 実行結果 V -> hoge
と -
のみの場合は値がセットされなくなります。
NULL
って?
次に気になるのはシェル変数の NULL
って何?ということです。
手元で調査した限りでは
NULL= NULL='' NULL=""
と、空の場合に加え、空文字列を指定した場合も NULL
として扱われています。
:+
(colon plus)
他にも、値がセットされている場合にのみ、上書きする、という書式もあります。 どういうケースで使えばいいのか。
P_PLUS=fuga V_PLUS=${V_PLUS:+hoge} # 実行結果 P_PLUS -> fuga V_PLUS -> hoge