シェル変数のデフォルト値: ${var:-default}と${var:=default}の使い方
bashのパラメータ展開で安全な変数デフォルト値を設定。${var:-default}、${var:=default}、${var:+alt}、${var:?error}パターンを解説します。
Quoting
詳細な説明
デフォルト値のパラメータ展開
Bashはパラメータ展開演算子を提供しており、未設定または空の変数を適切に処理できます。これらは、設定やパラメータの欠落を処理する堅牢なスクリプトの作成に不可欠です。
4つの演算子
| 構文 | 意味 |
|---|---|
${var:-default} |
varが未設定または空の場合、defaultを使用 |
${var:=default} |
varが未設定または空の場合、defaultを代入 |
${var:+alternate} |
varが設定済みかつ非空の場合、alternateを使用 |
${var:?error msg} |
varが未設定または空の場合、エラーで終了 |
${var:-default} — デフォルトを使用
# TMPDIRが設定されていない場合、/tmpを使用
workdir="${TMPDIR:-/tmp}/myapp"
mkdir -p "$workdir"
# デフォルトポート
port="${PORT:-8080}"
echo "Listening on port $port"
${var:=default} — デフォルトを代入
# デフォルトを設定して使用
: "${LOG_LEVEL:=info}"
echo "Log level: $LOG_LEVEL"
# LOG_LEVELが以前未設定だった場合、"info"になる
${var:?error} — 変数を必須にする
# 必須変数が欠けている場合、エラーで終了
: "${DATABASE_URL:?DATABASE_URLを設定してください}"
: "${API_KEY:?API_KEYは必須です}"
# 必須変数を使った安全なrm
rm -rf "${DEPLOY_DIR:?DEPLOY_DIRが設定されていません}/old_release"
${var:+alternate} — 条件付き値
# DEBUGが設定されている場合のみ--verboseフラグを追加
curl ${DEBUG:+--verbose} https://api.example.com
# 条件付き設定
docker run ${NETWORK:+--network "$NETWORK"} myimage
コロンなしの場合
コロンを省略(${var-default})すると、変数が未設定かどうかのみチェックし、空かどうかはチェックしません。空文字列が有効な値の場合に便利です。
ユースケース
設定管理スクリプト、Dockerエントリポイントスクリプト、CI/CDパイプライン、オプションの環境変数やコマンドライン引数を適切なデフォルト値で受け付けるスクリプト。