ShellCheck は、シェルスクリプトを実行せずに読んで、間違いや危ない書き方を指摘するツールです。自分のパソコンの中だけで動き、スクリプトをどこにも送らないので、書いたスクリプトをすぐに確かめられます。
この記事は、sh や bash でスクリプトを書き始めた人に向けています。読み終えると、次のことができるようになります。
- ShellCheck をインストールして、手元のスクリプトを確かめる
- 警告の番号(SC2086 など)から、公式 Wiki の説明を引く
- 不要な警告を抑えたり、CI に組み込んだりする
ShellCheck でできること
公式 README は、ShellCheck の目的として次のものを挙げています。
- 初心者がつまずきやすい文法の間違いを指摘し、シェルの分かりにくいエラーの意味を説明する
- 中級者が書きがちな、思ったとおりに動かない書き方を指摘する
- 今は動いていても、条件しだいで将来失敗する落とし穴を指摘する
対応する方言は sh(POSIX)、bash、dash、ksh、busybox です。どの方言として読むかは、ファイル先頭の shebang(#!/bin/bash など)や拡張子から自動で決まります。-s bash のように指定もできます。
セキュリティの面で役に立つのは、次のような指摘です。
| 番号 | 指摘の内容 | 起こりうる事故 |
|---|---|---|
| SC2086 | 変数をダブルクォートで囲んでいない | 値に空白や * などが入ると、単語分割やグロブ展開が起きて、別の引数やファイル名に化ける |
| SC2115 | rm -rf "$STEAMROOT/"* のように、変数が空だと /* になる書き方 |
変数が空のとき、ルートディレクトリの中身を消してしまう |
SC2115 の Wiki は、直し方として "${STEAMROOT:?}/"* を示しています。:? を付けると、変数が空か未設定のときにコマンドが失敗して止まります。
安全な試し方
-
パッケージマネージャでインストールします。公式 README には、次のような方法が載っています。
環境 コマンド Debian 系 sudo apt install shellcheckFedora 系 dnf install ShellCheckmacOS(Homebrew) brew install shellcheckWindows winget install --id koalaman.shellcheck、choco install shellcheck、scoop install shellcheckDocker docker run --rm -v "$PWD:/mnt" koalaman/shellcheck:stable myscriptGitHub Releases には、Linux・macOS・Windows 向けのビルド済みバイナリもあります。
-
練習用のファイル
test.shを作り、次の 2 行を書きます。中身は実行しないでください。#!/bin/bash echo $1 -
shellcheck test.shを実行します。$1に SC2086 の指摘が付きます。 -
echo "$1"に直して、もう一度実行します。指摘が消えれば完了です。
インストールせずに試すなら、ShellCheck.net にスクリプトを貼り付ける方法もあります。ただし、貼ったスクリプトはサーバーへ送られます(後の「注意点」を参照)。
結果の読み方と主な使い方
指摘には SC から始まる番号と重大度が付きます。番号で公式 Wiki(https://www.shellcheck.net/wiki/SC番号)を開くと、悪い例、直した例、理由が読めます。重大度は重いほうから error、warning、info、style の 4 段階です。
| やりたいこと | 書き方 |
|---|---|
| 重大度 warning 以上だけを表示する | shellcheck --severity=warning myscript(短縮形は -S) |
| 1 回の実行だけ特定の番号を外す | shellcheck -e SC2059 myscript |
| 次のコマンド 1 つだけ警告を抑える | 直前の行に # shellcheck disable=SC2059 |
| ファイル全体で抑える | shebang の直後に # shellcheck disable=SC2059 |
| プロジェクト全体で抑える | .shellcheckrc に disable=SC2059,SC2034 |
| 結果を機械で読む形にする | -f json1、-f checkstyle、-f gcc など |
終了コードは、問題がなければ 0、指摘があれば 1 です。そのため Makefile や CI に shellcheck myscripts/*.sh と書くだけで、指摘があるときにビルドを失敗させられます。公式 README は、新しい版で警告が増えてビルドが突然落ちるのを防ぐため、CI では版を固定して入れることを勧めています。pre-commit 用のフックも公式に用意されています。
エディタでは、VS Code(vscode-shellcheck)、Vim(ALE など)、Emacs(Flycheck など)、Sublime Text(SublimeLinter)などで、書きながら指摘を表示できます。
注意点
- ShellCheck.net に貼ったスクリプトは、ブラウザから同サイトのサーバー(
shellcheck.php)へ送られて解析されます。送られた内容をサーバーが保存するかどうか、どれくらいの期間残るかは、公式の記載を見つけられず未確認です。パスワード、API キー、社内のホスト名などが入ったスクリプトは、手元のshellcheckコマンドで確かめてください。 - 警告を
disableで抑えるときは、理由をコメントに残しておくと、後から見直せます。公式 Wiki によると、command1; command2のように 1 行に並べたコマンドでは、ディレクティブは最初のコマンドにしか効きません。 - 他人から受け取ったスクリプトを確かめるときも、ShellCheck は実行しないので安全に読めます。ただし、指摘がないことを理由にそのスクリプトを実行してよいとは判断しないでください。
次に読む
出典
- 公式リポジトリ(README)github.com/koalaman/shellcheck
- マニュアル(shellcheck.1.md)github.com/koalaman/shellcheck/blob/master/shellcheck.1.md
- Wiki:SC2086www.shellcheck.net/wiki/SC2086
- Wiki:SC2115www.shellcheck.net/wiki/SC2115
- Wiki:警告を無視する(Ignore)github.com/koalaman/shellcheck/wiki/Ignore
- ShellCheck.net(オンライン版)www.shellcheck.net
- ShellCheck.net のソース(shellcheck.js)github.com/koalaman/shellcheck.net/blob/master/shellcheck.js
確認日 2026-10-25
似たツール
Gitleaks
影響範囲 手元だけGit リポジトリやファイルに紛れ込んだパスワード、API キー、トークンなどの秘密情報を見つけるコマンドラインツール。
- 用途
- 防御
- 形式
- コマンドライン
- 難易度
- 初級
- ライセンス
- 自由に使えるMIT
- 分類
- 脆弱性スキャン
Trivy
影響範囲 手元だけコンテナイメージやコード、Kubernetes の脆弱性・設定ミス・埋め込まれた秘密情報を見つけるスキャナー。
- 用途
- 防御
- 形式
- コマンドライン
- 難易度
- 初級
- ライセンス
- 自由に使えるApache-2.0
- 分類
- 脆弱性スキャン/コンテナ・クラウド