導入
シェルスクリプトやCI/CDパイプラインを運用する際、「環境変数が設定されていない場合に備えてデフォルト値を指定したい」というケースは非常に頻繁に発生します。例えば、本番環境ではAPIキーを設定するが、ローカル環境ではダミー値で動作させたいといった場合です。これをif文で記述するとコードが長くなり、可読性が低下します。本記事では、シェルが標準で備える「パラメータ展開(Parameter Expansion)」を活用し、複雑な条件分岐を1行で簡潔に記述する方法を解説します。
基礎知識
シェルスクリプトにおける「パラメータ展開」とは、変数の中身を参照する際に、特定のパターンで値を加工・変換する仕組みです。今回紹介する ${VAR:-default} という構文は、変数が「未定義」または「空(null)」である場合に、指定した「default」の値を結果として返すというものです。これにより、環境ごとの差異を吸収し、スクリプトの移植性を高めることができます。
実装/解決策
実務では、特にDocker Composeの環境変数定義や、デプロイ用スクリプトの引数処理で重宝します。以下の考え方を活用します。
1. ${VAR:-default}: 変数が未定義か空ならデフォルト値を使用する。
2. ${VAR:=default}: 変数が未定義か空ならデフォルト値を代入した上で、その値を使用する(変数を更新したい場合に便利)。
3. ${VAR:?error_message}: 変数が未定義か空ならエラーを出力してスクリプトを中断する(必須設定の漏れを防ぐ)。
これらを使い分けることで、スクリプトの安全性を大幅に向上させることが可能です。
サンプルプログラム
以下のコードは、環境変数から設定値を読み込み、未定義の場合は安全なデフォルト値を適用する実装例です。
!/bin/bash
デフォルト値の設定例
DB_HOSTが未定義なら "localhost" を、
DB_PORTが未定義なら "5432" を使用する
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}
必須環境変数のチェック(未定義なら即座にスクリプトを停止)
:? を使うことで、設定漏れを早期に検知できる
: ${APP_ENV:?"エラー: APP_ENV が設定されていません。"}
echo "----------------------------"
echo "接続先: $DB_HOST:$DB_PORT"
echo "実行環境: $APP_ENV"
echo "----------------------------"
実行方法:
1. そのまま実行: APP_ENV=dev ./script.sh
2. 変数を上書き: DB_HOST=db.example.com APP_ENV=prod ./script.sh
応用・注意点
現場での運用において、以下の点に注意してください。
・空文字の扱い: ${VAR:-default} は、変数が未定義(unset)の場合だけでなく、変数が空文字列(””)の場合もデフォルト値が適用されます。もし「空文字は有効な値として扱いたい」場合は、${VAR-default}(コロンを抜いた形式)を使用してください。
・読みやすさの維持: 複雑な展開を1行に詰め込みすぎると、バグの原因になります。デフォルト値のロジックが複雑になる場合は、無理に展開記法を使わず、素直にif文で記述することも検討してください。
・デバッグの容易性: 環境変数をデフォルト値に頼りすぎると、意図せずローカル環境の設定が本番に混入するリスクがあります。重要な設定は ${VAR:?メッセージ} を活用し、「設定漏れ」を暗黙的な成功にせず、明示的な失敗として検知させる設計が重要です。

コメント