シェル: set -u で未定義の変数を使った時点で止める
スクリプトの先頭に set -u を書くと、定義されていない変数を展開した時点でエラーになって止まる。空の変数のせいで rm -rf "$DIR/cache" が rm -rf /cache になる事故を防げる。
使う場面
削除・上書き・デプロイなど、パスや対象を変数で組み立てるスクリプト全般。変数名の打ち間違い($DIR と $DIRS)や、環境変数の渡し忘れにもすぐ気づける。
やり方
bash
#!/usr/bin/env bash
set -euo pipefail # -e: 失敗で止める / -u: 未定義変数で止める / pipefail: パイプ途中の失敗も拾う
rm -rf "$DIR/cache"
# → line 4: DIR: unbound variable で止まり、rm は実行されない未定義かもしれない変数は、既定値か「必須」を明示して書く。
bash
LOG_LEVEL="${LOG_LEVEL:-info}" # なければ既定値
: "${DIR:?DIR を指定してください}" # なければメッセージを出して終了
rm -rf "${DIR:?}/cache" # その場で必須チェックする書き方
if [[ -n "${OPTIONAL:-}" ]]; then ...; fi # あってもなくてもよい変数の判定注意点
set -uは「未定義」で止めるだけで、「定義済みだが空文字」(DIR="")では止まらない。空も困るなら${DIR:?}を使う(:付きは空も弾く)。- bash 4.3 以前は、空配列の
"${arr[@]}"も unbound 扱いで止まる。古い環境では${arr[@]+"${arr[@]}"}と書く。 $1などの位置引数も対象。引数なしで呼べる関数では${1:-}と書く。- 構文チェックは シェル: bash -n でスクリプトを実行せずに文法だけ確かめる、静的な検査は ShellCheck と組み合わせる。