bashのパラメータ展開方法

  • Bash
  • Shell

この記事は、構成と文章の整理に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 $VAR
echo ${VAR:-hoge} # hoge
echo $VAR # 空のまま(書き換わらない)
echo ${VAR:=foo} # foo
echo $VAR # foo(今度は書き換わってる)
echo ${VAR:?foo} # -bash: VAR: foo (未定義/空文字なら即エラー)
VAR=bar
echo ${VAR:?foo} # bar(定義済みなので素通り)
echo ${VAR:+foo} # foo(定義済みなので発動)

コロンの有無で判定基準が変わる

ここが地味に忘れがちなところ。: を付けるかどうかで「何をもって発動条件とするか」が変わる。

  • ${VAR:-hoge} → 未定義 または 空文字列 の両方で発動
  • ${VAR-hoge}(コロンなし) → 未定義の場合のみ発動。空文字列なら発動しない

これは := :? :+ も同じ。コロンを外すと「空文字列」は判定の対象から外れて、「未定義かどうか」だけを見るようになる。

ターミナル
VAR=""
echo ${VAR:-hoge} # hoge(空文字列なので発動)
echo ${VAR-hoge} # 空(定義済み扱いなので発動しない)

なので、「値が入っているかどうか」を厳密に見たいなら : あり、「変数が定義されているかどうか」だけを見たいなら : なし、という使い分けになる。