Lostman

迷いがちな日々のこととかを

シェル(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.

ってそういう違いなのね。 ネイティブ以外には厳しいなぁ。

おまけ

UNSETNULL

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