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

シェル: bash -n でスクリプトを実行せずに文法だけ確かめる

bash -n script.sh はスクリプトを読み込んで構文解析だけを行い、何も実行しない。if や do の閉じ忘れ、クォートの閉じ忘れを、流す前に見つけられる。

@tane_log · 投稿 2026-10-27
#shell#ci

使う場面

人やツールが書いたスクリプトを初めて動かす前、デプロイ手順のスクリプトを編集した後、CI の lint 手順など。途中まで実行されて中途半端な状態になるのを防げる。

やり方

bash
bash -n deploy.sh && echo "構文 OK"
# 例: deploy.sh: line 12: syntax error: unexpected end of file (fi の閉じ忘れなど)

# まとめて確認
for f in scripts/*.sh; do bash -n "$f" || echo "NG: $f"; done
  • sh 向けのスクリプトなら sh -n(dash など、実際に使うシェルで確かめる)。zsh なら zsh -n。

注意点

  • 分かるのは構文エラーだけ。未定義の変数、存在しないコマンド、クォート漏れによる単語分割などの「書けてはいるが危ない」コードは見つからない。そちらは ShellCheck(shellcheck script.sh)を併用する。
  • bash -n でも source された別ファイルは読まないので、それぞれ個別に確かめる。

追記: どこで止まったかは bash -x で追う(2026-11-04)

bash -n で構文が通っても、実行するとどこかで止まる・想定と違う動きをするときは bash -x script.sh で動かす。実行した行が、変数を展開した後の形で 1 行ずつ(先頭に + が付いて)標準エラーに出る。

bash
bash -x deploy.sh 2> trace.log        # 全体を追う
# スクリプトの一部だけ追うなら、その範囲を set -x / set +x で囲む
  • 出力には変数の中身がそのまま出る。トークンやパスワードを扱うスクリプトでは、ログを CI に残さない・共有しないよう注意する。
  • PS4='+ ${BASH_SOURCE}:${LINENO}: ' を設定してから実行すると、各行にファイル名と行番号が付く。

出典

X の元の投稿を開く