シェルスクリプトを書く際に、変数展開で、代替値やデフォルト値をよく使用する。
これらは、コロン付きと無しで、値が空の時と変数が未定義の時の挙動が変化するのだが、毎回忘れて、確認しているので、覚え方と共にまとめておく。
コロン付き代替値 :+
空の場合は、代替値を使用しない。変数に1文字以上の値が入っていれば、値があるものとして、代替値を使用する。
人が中身を見た時に見た目に値があれば、代替値
hoge=Hello
foo=""
echo ${hoge:+exist}
# exist
echo ${foo:+empty}
#
echo ${bar:+undefined}
#
コロン無し代替値 +
変数が定義済みであれば、空文字でも、代替値を使用する。
変数が定義済みならば、代替値
hoge=Hello
foo=""
echo ${hoge+exist}
# exist
echo ${foo+empty}
# empty
echo ${bar+undefined}
#
コロン付きデフォルト値 :-
値がある場合は、存在する値を使用する。
空の場合と変数未定義は、デフォルト値を使用する。
人が中身を見たときに、値が見えなければデフォルト値
hoge=Hello
foo=""
echo ${hoge:-exist}
# Hello
echo ${foo:-empty}
# empty
echo ${bar:-undefined}
# undefined
コロン無しデフォルト値 -
変数未定義のみ、デフォルト値を使用する。
変数が未定義ならば、デフォルト値
hoge=Hello
foo=""
echo ${hoge-exist}
# Hello
echo ${foo-empty}
#
echo ${bar-undefined}
# undefined
まとめ
コロン:
付きである場合は、表示した際に人が見て中身があるかどうかが分かることが重要と覚えておこう。
コロン無しの場合は、システム的に該当変数が存在しているかどうかで判別されているみたい。
とにかく、コロン=人