テック技報最新号へ →
コード

シェル: set -u で未定義の変数を使った時点で止める

スクリプトの先頭に set -u を書くと、定義されていない変数を展開した時点でエラーになって止まる。空の変数のせいで rm -rf "$DIR/cache" が rm -rf /cache になる事故を防げる。

@tane_log · 投稿 2026-11-09
#shell#bash#ci

使う場面

削除・上書き・デプロイなど、パスや対象を変数で組み立てるスクリプト全般。変数名の打ち間違い($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 と組み合わせる。

出典

X の元の投稿を開く