shellcheck – シェルスクリプトを静的解析してバグや非推奨記法を指摘する

コード索引・ナビゲーション
スポンサーリンク

shellchecksh/bash/dash/ksh 向けのシェルスクリプトを静的解析し、ポータビリティや引用漏れ、未定義変数などの問題をわかりやすく指摘するリンターです。CI連携やエディタ統合にも適しており、TUI表示のほか機械可読な出力も備えます。 (GitHub)
実務では、コミット前の品質チェックCIでの自動検査レガシーシェルの移植性確認に使います。

構文(Syntax)

# 基本
shellcheck [OPTIONS] FILE...

# 代表例
shellcheck script.sh                 # 人間向け(TTY)出力
shellcheck -s bash -f gcc script.sh  # 解析シェル/出力形式を指定
shellcheck -e SC2086,SC2046 script.sh    # 指定コードを除外
shellcheck -o all script.sh              # すべての「任意チェック」を有効化
shellcheck -x -P SCRIPTDIR script.sh     # source先も追跡し、探索パスを指定

オプションと挙動は man ページに準拠します。 (manpages.ubuntu.com)

主なオプション一覧

オプション説明使用例
`-s, –shell shbashdash
`-f, –format ttygcccheckstyle
`-S, –severity errorwarninginfo
-e, --exclude CODE[,CODE...]指定した警告コードを除外。範囲(SC3000-SC4000)や all も可。shellcheck -e SC2086,SC2046 script.sh (manpages.ubuntu.com)
-i, --include CODE[,CODE...]含めるコードを限定(除外より強い)。shellcheck -i SC2002 script.sh (manpages.ubuntu.com)
-o, --enable NAME[,NAME...]「任意チェック」を名前で有効化。all ですべて有効。--list-optional で一覧。shellcheck -o all script.sh / shellcheck --list-optional (manpages.ubuntu.com)
-x, --external-sourcessource された入力外ファイルも追跡して解析。shellcheck -x script.sh (manpages.ubuntu.com)
-a, --check-sourced解析対象に含めた source 先ファイルの中の問題も出力。shellcheck -a script.sh (manpages.ubuntu.com)
-P, --source-path PATHSsource 探索パス(Unixは : 区切り)。特殊値 SCRIPTDIR あり。shellcheck -P SCRIPTDIR:lib script.sh (manpages.ubuntu.com)
-C, --color[=WHEN] / -W NUM端末出力の色/警告ごとのWikiリンク数を制御。shellcheck -C always -W 0 script.sh (manpages.ubuntu.com)
--norc.shellcheckrc を読み込まない。shellcheck --norc script.sh (manpages.ubuntu.com)
-V, --versionバージョン表示。shellcheck -V (manpages.ubuntu.com)

実行例

基本:1ファイルを解析(TTY出力)

説明:典型的な引用漏れ(SC2086)等を人間向けに表示。
コマンド

shellcheck script.sh

出力例(例)

In script.sh line 3:
echo $file
     ^----^ SC2086: Double quote to prevent globbing and word splitting.

gcc 形式でエディタや make と連携

説明-f gcc<file>:<line>:<col>: <type>: <msg> 形式で出力し、エディタのエラー遷移に便利。
コマンド

shellcheck -f gcc script.sh

出力例(例)

script.sh:3:6: warning: Double quote to prevent globbing and word splitting. [SC2086]

(manpages.ubuntu.com)

source されたファイルも追跡して解析

説明:動的に source されるライブラリも検査対象に含めます。
コマンド

shellcheck -x -P SCRIPTDIR src/main.sh

出力例src/lib/util.sh 内の警告も併せて表示。 (manpages.ubuntu.com)

その場で抑制/有効化(ディレクティブ)

説明:コード内のコメントで特定警告の無効化/任意チェック有効化が可能。
コマンド

# shellcheck disable=SC2035
echo "Files: " *.jpg

# ファイル全体で任意チェックを有効化
# shellcheck enable=quote-safe-variables

出力例:該当警告が出力されない/新たなチェックが有効。 (manpages.ubuntu.com)

エラー例:未知のフォーマッタを指定

説明:存在しないフォーマッタ名を渡すとエラー終了(終了コード 4)。
コマンド

shellcheck -f unknown script.sh; echo $?

出力例(例)

shellcheck: unrecognized format 'unknown'
4

(終了コードの意味:0=問題なし、1=問題あり、2=処理不可、3=呼び出し構文誤り、4=不正オプション) (manpages.ubuntu.com)

関連コマンド

  • shfmt:シェルスクリプトの整形ツール(スタイル統一)。
  • bats:Bashスクリプトの単体テスト実行(TAP/JUnit出力)。
  • bash / dash / ksh:対象シェル。-n(構文チェック)などと併用。
  • grep / sed / awk:指摘箇所の一括修正に補助。

備考

  • 対応シェルsh/bash/dash/ksh のみを正式サポート。zsh 等は未サポート(必要なら -s# shellcheck shell=bash などで明示)。 (ShellCheck)
  • 設定ファイル.shellcheckrc(または shellcheckrc)でディレクティブをファイル全体に適用可能。親ディレクトリを遡って検索し、見つからなければ ~/.shellcheckrc~/.config/shellcheckrc を参照します。Snap 版は隠しファイルにアクセスできないため shellcheckrc 名を利用します。 (manpages.ubuntu.com)
  • 環境変数SHELLCHECK_OPTS に既定フラグを設定可能(例:export SHELLCHECK_OPTS='--shell=bash --exclude=SC2016')。 (manpages.ubuntu.com)
  • source 解析-x で入力外の source も追跡。-P/source-path=... で探索ルートを追加できます。 (manpages.ubuntu.com)
  • 出力形式の活用gcc/checkstyle 形式はエディタ/CI連携、diff は提案修正を git apply 等で適用する用途に。 (manpages.ubuntu.com)
  • オンライン版:ローカルに入れなくても Web で試せます(貼り付けて即解析)。機密コードは避けましょう。 (ShellCheck)

参考

  • manページ(Ubuntu): shellcheck(1) (manpages.ubuntu.com)
  • manページ(Arch Linux): shellcheck(1) (Arch Manual Pages)
  • 公式GitHub: koalaman/shellcheck(README・Issue・Wiki) (GitHub)
  • ShellCheck Wiki(警告コード解説の索引) (ShellCheck)
  • オンライン版 ShellCheck(ブラウザでお試し) (ShellCheck)
スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント