

bashのパラメータ展開方法
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
bashのパラメータ展開、${VAR:-hoge} みたいなやつを整理した。4種類あって、それぞれ役割が違う。
4種類の挙動
${VAR:-hoge}: VARが未定義または空文字列ならhogeを返す。VAR自体は書き換わらない${VAR:=foo}: VARが未定義または空文字列ならfooを代入してから返す。VARに反映される${VAR:?foo}: VARが未定義または空文字列ならエラー終了。メッセージとしてfooが出る${VAR:+foo}: VARが定義済み(かつ空でない)場合のみfooを返す。他と逆で、値があるときに発動する
実際に試すとこう。
# 未定義変数echo $VARecho ${VAR:-hoge} # hogeecho $VAR # 空のまま(書き換わらない)
echo ${VAR:=foo} # fooecho $VAR # foo(今度は書き換わってる)
echo ${VAR:?foo} # -bash: VAR: foo (未定義/空文字なら即エラー)
VAR=barecho ${VAR:?foo} # bar(定義済みなので素通り)
echo ${VAR:+foo} # foo(定義済みなので発動)コロンの有無で判定基準が変わる
ここが地味に忘れがちなところ。: を付けるかどうかで「何をもって発動条件とするか」が変わる。
${VAR:-hoge}→ 未定義 または 空文字列 の両方で発動${VAR-hoge}(コロンなし) → 未定義の場合のみ発動。空文字列なら発動しない
これは := :? :+ も同じ。コロンを外すと「空文字列」は判定の対象から外れて、「未定義かどうか」だけを見るようになる。
VAR=""echo ${VAR:-hoge} # hoge(空文字列なので発動)echo ${VAR-hoge} # 空(定義済み扱いなので発動しない)なので、「値が入っているかどうか」を厳密に見たいなら : あり、「変数が定義されているかどうか」だけを見たいなら : なし、という使い分けになる。