Help us understand the problem. What is going on with this article?

シェルの変数展開のデフォルト値の扱い

More than 3 years have passed since last update.

シェルスクリプトを書く際に、変数展開で、代替値やデフォルト値をよく使用する。
これらは、コロン付きと無しで、値が空の時と変数が未定義の時の挙動が変化するのだが、毎回忘れて、確認しているので、覚え方と共にまとめておく。

コロン付き代替値 :+

空の場合は、代替値を使用しない。変数に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

まとめ

コロン:付きである場合は、表示した際に人が見て中身があるかどうかが分かることが重要と覚えておこう。
コロン無しの場合は、システム的に該当変数が存在しているかどうかで判別されているみたい。
とにかく、コロン=人

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away