shellcheck-configuration について
ShellCheckの設定とシェルスクリプトの静的解析に関する実践ガイドです。スクリプトを保守するチーム向けに、ルール設定、診断への対処、CI連携、キャッシュ利用時の注意点を説明します。
主な機能
- 01対象シェルとチェック項目の設定
- 02一般的な診断と修正方法の解説
- 03理由を記録した警告抑制
- 04CIとコミット前チェックの連携
- 05出力形式とキャッシュ上の注意点
活用シーン
- 01CIでのシェルスクリプト検査
- 02プロジェクトの .shellcheckrc 設定
- 03ShellCheck警告の調査と修正
- 04コミット前のスクリプト検査追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill shellcheck-configurationインストール後、Claude Code で/shellcheck-configurationを入力して読み込まれたか確認します。
詳細
ShellCheck の設定と静的解析
ShellCheck を設定して使用し、静的コード解析を通じてシェルスクリプトの品質を高め、よくある落とし穴を検出し、ベストプラクティスを徹底するための包括的なガイダンスです。
このスキルを使用しない場合
- タスクが ShellCheck の設定や静的解析に関係しない場合
- この範囲外の別の分野やツールが必要な場合
指示
- 目標、制約、必要な入力を明確にします。
- 関連するベストプラクティスを適用し、結果を検証します。
- 実行可能な手順と検証方法を提示します。
このスキルを使用する場合
- CI/CD パイプラインでシェルスクリプトのリントを設定する場合
- 既存のシェルスクリプトを分析して問題を特定する場合
- ShellCheck のエラーコードと警告について理解する場合
- 特定のプロジェクト要件に合わせて ShellCheck を設定する場合
- ShellCheck を開発ワークフローに統合する場合
- 誤検知を抑制し、ルールセットを設定する場合
- 一貫したコード品質基準を徹底する場合
- 品質ゲートを満たすようにスクリプトを移行する場合
ShellCheck の基礎
ShellCheck とは?
ShellCheck はシェルスクリプトを分析し、問題のあるパターンを検出する静的解析ツールです。以下をサポートしています。
- Bash、sh、dash、ksh などの POSIX シェル
- 100 種類を超える警告とエラー
- 対象シェルとフラグの設定
- エディターや CI/CD システムとの統合
インストール
# macOS with Homebrew
brew install shellcheck
# Ubuntu/Debian
apt-get install shellcheck
# From source
git clone https://github.com/koalaman/shellcheck.git
cd shellcheck
make build
make install
# Verify installation
shellcheck --version
設定ファイル
.shellcheckrc(プロジェクトレベル)
プロジェクトのルートに .shellcheckrc を作成します。
# Specify target shell
shell=bash
# Enable optional checks
enable=avoid-nullary-conditions
enable=require-variable-braces
# Disable specific warnings
disable=SC1091
disable=SC2086
オプションと診断リファレンス
インストール済みの shellcheck --help と公式の診断ページを使用します。
存在しない SHELLCHECK_SHELL/STRICT/CONFIG 環境変数や、数値コードの
範囲による分類を前提にしないでください。--shell=bash(または sh)、
--enable、除外項目を明示的に設定し、抑制範囲を狭くし、理由を記録します。
- SC2086:引用符で囲まれていない展開では、単語分割やグロブ展開が発生する可能性があります。Bash 配列の場合は、
for item in "${items[@]}"; do ...; doneのように反復処理します。スカラー値のリスト全体を引用符で囲むと セマンティクスが変わるため、常に有効な修正とは限りません。 - SC2206:
array=( $items )でも単語分割やグロブ展開が発生します。実際の形式に応じて、意図的に配列を構築するか、適切な read/mapfile 操作を使用します。 - SC2181:
if command; then ...; fiのように、コマンドを直接確認します。 - SC2015:
a && b || cは、b が失敗した場合にも c を実行します。その動作が問題になる場合は if/else を使用します。 - SC3010:
[[ ... ]]は POSIX sh では使用できません。有効な[ ... ]または case 構文を使用します。
SC2086 と 公式プロジェクト/オプションを参照してください。
実用的な設定例
最小限の設定(厳密な POSIX)
#!/bin/bash
# Configure for maximum portability
shellcheck \
--shell=sh \
--external-sources \
--check-sourced \
script.sh
開発用設定(ルールを緩和した Bash)
#!/bin/bash
# Configure for Bash development
shellcheck \
--shell=bash \
--exclude=SC1091,SC2119 \
--enable=all \
script.sh
CI/CD 統合設定
#!/bin/bash
set -Eeuo pipefail
# Analyze all shell scripts and fail on issues
find . -type f -name "*.sh" | while read -r script; do
echo "Checking: $script"
shellcheck \
--shell=bash \
--format=gcc \
--exclude=SC1091 \
"$script" || exit 1
done
プロジェクト用 .shellcheckrc
# Shell dialect to analyze against
shell=bash
# Enable optional checks
enable=avoid-nullary-conditions,require-variable-braces,check-unassigned-uppercase
# Disable specific warnings
# SC1091: Not following sourced files (many false positives)
disable=SC1091
# SC2119: Use function_name instead of function_name -- (arguments)
disable=SC2119
# External files to source for context
external-sources=true
統合パターン
pre-commit フックの設定
#!/bin/bash
# .git/hooks/pre-commit
#!/bin/bash
set -e
# Find all shell scripts changed in this commit
git diff --cached --name-only | grep '\.sh$' | while read -r script; do
echo "Linting: $script"
if ! shellcheck "$script"; then
echo "ShellCheck failed on $script"
exit 1
fi
done
GitHub Actions ワークフロー
name: ShellCheck
on: [push, pull_request]
jobs:
shellcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run ShellCheck
run: |
sudo apt-get install shellcheck
find . -type f -name "*.sh" -print0 | xargs -0 shellcheck
GitLab CI パイプライン
shellcheck:
stage: lint
image: koalaman/shellcheck-alpine
script:
- find . -type f -name "*.sh" -print0 | xargs -0 shellcheck
allow_failure: false
ShellCheck 違反への対処
特定の警告を抑制する
#!/bin/bash
# Disable warning for entire line
# shellcheck disable=SC2086
for file in $(ls -la); do
echo "$file"
done
# Disable for entire script
# shellcheck disable=SC1091,SC2119
# Disable multiple warnings (format varies)
command_that_fails() {
# shellcheck disable=SC2015
[ -f "$1" ] && echo "found" || echo "not found"
}
# Disable specific check for source directive
# shellcheck source=./helper.sh
source helper.sh
よくある違反と修正方法
SC2086:単語分割を防ぐには二重引用符で囲む
# Problem
for i in $list; do done
# Solution
for i in "${list[@]}"; do printf '%s\n' "$i"; done # Bash array, not a scalar list
SC2181:終了コードを直接確認する
# Problem
some_command
if [ $? -eq 0 ]; then
echo "success"
fi
# Solution
if some_command; then
echo "success"
fi
SC2015:&& || の代わりに if-then を使用する
# Problem
[ -f "$file" ] && echo "exists" || echo "not found"
# Solution - clearer intent
if [ -f "$file" ]; then
echo "exists"
else
echo "not found"
fi
SC2016:単一引用符内の式は展開されない
# Problem
echo 'Variable value: $VAR'
# Solution
echo "Variable value: $VAR"
SC2009:grep の代わりに pgrep を使用する
# Problem
ps aux | grep -v grep | grep myprocess
# Solution
pgrep -f myprocess
パフォーマンスの最適化
複数のファイルをチェックする
#!/bin/bash
# Sequential checking
for script in *.sh; do
shellcheck "$script"
done
# Parallel checking (faster)
find . -name "*.sh" -print0 | \
xargs -0 -P 4 -n 1 shellcheck
キャッシュ結果は、メインスクリプトに加えて、ShellCheck のバージョン/オプション、シェルの方言、rc ファイル、ソース対象ファイルの内容にも紐付けてください。以下のハッシュのみを使う例では、これらの入力が変更された場合、CI での再利用には不十分です。pre-commit チェックでは、異なる作業ツリーを暗黙にリントするのではなく、ステージ済みのバイト列(一部だけステージされたファイルを含む)を検査する必要があります。NUL 区切りのパスを使用し、削除済みファイルは除外します。
結果をキャッシュする
#!/bin/bash
CACHE_DIR=".shellcheck_cache"
mkdir -p "$CACHE_DIR"
check_script() {
local script="$1"
local hash
local cache_file
hash=$(sha256sum "$script" | cut -d' ' -f1)
cache_file="$CACHE_DIR/$hash"
if [[ ! -f "$cache_file" ]]; then
if shellcheck "$script" > "$cache_file" 2>&1; then
touch "$cache_file.ok"
else
return 1
fi
fi
[[ -f "$cache_file.ok" ]]
}
find . -name "*.sh" | while read -r script; do
check_script "$script" || exit 1
done
出力形式
デフォルト形式
shellcheck script.sh
# Output:
# script.sh:1:3: warning: foo is referenced but not assigned. [SC2154]
GCC 形式(CI/CD 用)
shellcheck --format=gcc script.sh
# Output:
# script.sh:1:3: warning: foo is referenced but not assigned.
JSON 形式(解析用)
shellcheck --format=json script.sh
# Output:
# [{"file": "script.sh", "line": 1, "column": 3, "level": "warning", "code": 2154, "message": "..."}]
Quiet 形式
shellcheck --format=quiet script.sh
# Returns non-zero if issues found, no output otherwise
ベストプラクティス
- CI/CD で ShellCheck を実行する - マージ前に問題を検出します
- 対象のシェルに合わせて設定する - bash を sh として解析しないでください
- 除外理由を記録する - 違反を抑制する理由を説明します
- 違反に対処する - 警告を無効にするだけにしないでください
- 厳格モードを有効にする - 慎重に除外項目を設定し、
--enable=allを使用します - 定期的に更新する - 新しいチェックに対応できるよう、ShellCheck を最新の状態に保ちます
- pre-commit フックを使用する - プッシュ前にローカルで問題を検出します
- エディターと連携する - 開発中にリアルタイムのフィードバックを得られます
リソース
- ShellCheck GitHub: https://github.com/koalaman/shellcheck
- ShellCheck Wiki: https://www.shellcheck.net/wiki/
- エラーコードのリファレンス: https://www.shellcheck.net/
制限事項
- このスキルは、タスクが上記の説明の範囲に明確に該当する場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認を求めてください。