shellcheck

Shell スクリプト静的(せいてき) 解析(かいせき) ツール。一般的(いっぱんてき) なエラーと潜在的(せんざいてき)問題(もんだい)検出(けんしゅつ)

インストール

# macOS
brew install shellcheck

# Ubuntu/Debian
sudo apt install shellcheck

# Arch Linux
sudo pacman -S shellcheck

基本使用法

# スクリプトをチェック
shellcheck script.sh

# 複数のスクリプトをチェック
shellcheck script1.sh script2.sh

# stdin から読み取り
cat script.sh | shellcheck -

出力形式

# デフォルト形式(端末フレンドリー)
shellcheck script.sh

# JSON 形式
shellcheck -f json script.sh

# GCC 形式(CI 向け)
shellcheck -f gcc script.sh

# checkstyle 形式
shellcheck -f checkstyle script.sh

Shell を指定

# bash として指定
shellcheck -s bash script.sh

# sh (POSIX) として指定
shellcheck -s sh script.sh

# zsh として指定
shellcheck -s zsh script.sh

警告を除外

コマンドラインで除外

# 特定の警告を除外
shellcheck -e SC2034 script.sh

# 複数の警告を除外
shellcheck -e SC2034,SC2086 script.sh

スクリプト内で除外

#!/bin/bash
# shellcheck disable=SC2034
unused_var="value"

# ブロック全体を除外
# shellcheck disable=SC2086
echo $unquoted_var

設定ファイルで除外

.shellcheckrc で:

disable=SC2034,SC2086

常見警告コード

警告(けいこく) コード説明(せつめい)
SC2034未使用(みしよう)変数(へんすう)
SC2086変数(へんすう) がクォートされていない
SC2046コマンド置換(ちかん) がクォートされていない
SC2155宣言(せんげん)代入(だいにゅう)分離(ぶんり) すべき
SC2164cd 失敗(しっぱい) 時の処理(しょり) がない
SC2006バッククォートの() わりに $() を使用(しよう)

重大度

# エラーのみを表示
shellcheck -S error script.sh

# 警告以上を表示
shellcheck -S warning script.sh

# すべてを表示(スタイル提案を含む)
shellcheck -S style script.sh

エディタ統合

VS Code

ShellCheck 拡張 をインストール

Vim

ALE または Syntastic プラグインを使用(しよう)

.vimrc の例

let g:ale_linters = {'sh': ['shellcheck']}

CI 統合

GitHub Actions

- name: ShellCheck
  uses: ludeeus/action-shellcheck@master

手動 CI

find . -name "*.sh" -exec shellcheck {} +