シェル変数のデフォルト値: ${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パイプライン、オプションの環境変数やコマンドライン引数を適切なデフォルト値で受け付けるスクリプト。

試してみる — Shell Script Linter

フルツールを開く