解説
未設定と空文字は同じ?Bashの既定値で「-」と「:-」を使い分けよう
変数なし・空文字・値ありの三状態で、既定値の展開を比較。コロンの有無、設定済み判定、実際の変数を書き換えない条件を確認。

設定が空なら既定値を使いたい。でも「値を空にする指定」と「まだ何も指定していない状態」を分けたいこともあるよね。
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の書き方として確かめよう。終了したら括弧の外へ戻るので、練習用の関数や変数を普段の環境へ残す後始末は不要だよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。