DESIGN / CODE / INFRA / AI

解説

未設定と空文字は同じ?Bashの既定値で「-」と「:-」を使い分けよう

変数なし・空文字・値ありの三状態で、既定値の展開を比較。コロンの有無、設定済み判定、実際の変数を書き換えない条件を確認。

未設定と空文字は同じ?Bashの既定値で「-」と「:-」を使い分けよう
保存リストを見る →
この記事の道しるべ 5項目

設定が空なら既定値を使いたい。でも「値を空にする指定」と「まだ何も指定していない状態」を分けたいこともあるよね。

Bashの変数には、未設定と、設定されているが空文字という違いがある。このページでは、既定値を選ぶ二つの書き方を比べるよ。Bashが使えるターミナルがあれば準備完了。秘密の環境変数ではなく、練習用の名前だけを使おう。

三つの状態を言葉にする

状態 今回の意味
未設定 変数をunsetした状態
空文字 変数へ''を代入した状態
値あり 変数へblueを代入した状態

画面に文字が出ないからと、最初の二つを同じだと決めないでね。設定ファイルなどで、空欄自体に意味を持たせる場合もあるんだ。

コロンがあると、空文字も既定値の対象

(
  show_value() {
    printf '%s | minus=<%s> | colon=<%s> | set=<%s>\n' \
      "$1" "${practice_option-default}" \
      "${practice_option:-default}" "${practice_option+yes}"
  }
  unset practice_option
  show_value unset
  practice_option=''
  show_value empty
  practice_option='blue'
  show_value value
)

括弧の中だけで動くので、同じ名前の変数が普段のターミナルにあっても、その値をここで書き換えたままにしない。show_valueは、同じ表示処理に名前を付けた関数だよ。

出力では、minusがコロンなし、colonがコロンありの書き方を表している。

unset | minus=<default> | colon=<default> | set=<>
empty | minus=<> | colon=<default> | set=<yes>
value | minus=<blue> | colon=<blue> | set=<yes>

空欄を残すか、置き換えるかで選ぶ

${practice_option-default}は、未設定の場合にだけdefaultを使う。値が空文字でも設定済みなら、その空文字を使うよ。

${practice_option:-default}は、未設定または空文字の場合にdefaultを使う。文字が入っている必要がある設定なら、こちらが目的に合う場合があるね。

どちらの例も、表示に使う値を選ぶ展開だよ。元の変数へdefaultを代入しているわけではない。値を書き込む別の演算子と混ぜて覚えないようにしよう。

「設定済み」だけを見たいとき

今回のset欄の${practice_option+yes}は、変数が設定済みならyes、未設定なら空文字を返す。空文字が代入されていてもyesになるので、「値が入っている」ことの判定とは違うんだ。

実際の設定確認では、変数の値を一括表示せず、このように有無や必要な条件だけを見る方法も考えられる。ただし、設定済みと分かっても、値が正しい・安全・期限内だとは分からないよ。

エラーが出たら、名前と括弧を見る

パラメーター展開は、変数の名前の周りを${...}で囲む書き方。中に余計な空白を入れると、意図した式にならない場合がある。例はコマンドへ渡す値を二重引用符で囲んでいるので、空文字も一つの引数として残るよ。

PowerShellやWindowsの通常のコマンドプロンプトには、そのまま貼らないでね。この練習はBashの書き方として確かめよう。終了したら括弧の外へ戻るので、練習用の関数や変数を普段の環境へ残す後始末は不要だよ。

GNU Bashの資料を2026年10月29日に確認し、Bash 5.2の三状態と、練習後に親の変数を保持することを検証した。シェルの引用符、変数とexportも合わせて読めるよ。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。