mcpField
S
shell-scripting

shell-scripting

github.com/ancoleman開発52682 回インストール46 週間前に更新
リポジトリ

shell-scripting について

shell-scriptingは、保守しやすいシェルスクリプトを書くためのスキルで、コマンドライン作業を自動化する開発者や運用担当者向けです。移植性、エラー処理、引数解析、ユーティリティ連携に加え、ShellCheckとBatsによる検証を扱います。

主な機能

  1. 01POSIX shとBashの選択指針
  2. 02エラー処理とクリーンアップのパターン
  3. 03短縮・長形式オプションの解析
  4. 04jq、yq、テキスト処理ツールの例
  5. 05ShellCheckとBatsによるテスト指針

活用シーン

  1. 01CI/CDパイプライン作業の自動化
  2. 02コンテナのエントリーポイント作成
  3. 03バックアップやログローテーションのジョブ作成
  4. 04プロジェクト用スクリプトやテストランナーの構築

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ancoleman/ai-design-components --skill shell-scripting

インストール後、Claude Code で/shell-scriptingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

outputs.yaml
examples/
error-handling.sh
getopts-advanced.sh
getopts-basic.sh
json-yaml-processing.sh
long-options.sh
production-template.sh
references/
argument-parsing.md
common-utilities.md
error-handling.md
parameter-expansion.md
portability-guide.md
testing-guide.md
scripts/
lint-script.sh
test-script.sh

詳細

シェルスクリプト

目的

エラー処理、引数解析、移植性への配慮を含む、保守しやすいシェルスクリプトを作成するためのパターンとベストプラクティスを提供します。POSIX sh と Bash の選択、パラメーター展開、一般的なユーティリティ(jq、yq、awk)との連携、ShellCheck と Bats を使ったテストについて説明します。

このスキルを使うタイミング

次のような場合にシェルスクリプトを使います:

  • 既存のコマンドラインツールやシステムユーティリティを連携させる
  • CI/CD パイプラインのスクリプトを作成する(GitHub Actions、GitLab CI)
  • コンテナーのエントリーポイントや初期化スクリプトを作成する
  • システム管理タスクを自動化する(バックアップ、ログローテーション)
  • 開発ツールを構築する(ビルドスクリプト、テストランナー)

次の場合は、Python または Go の使用を検討してください:

  • 複雑なビジネスロジックやデータ構造が必要
  • クロスプラットフォームの GUI が必要
  • API との連携が多い(REST、gRPC)
  • スクリプトが 200 行を超え、ロジックが大幅に複雑

POSIX sh と Bash

次の場合は POSIX sh(#!/bin/sh)を使います:

  • 最大限の移植性が必要(Linux、macOS、BSD、Alpine)
  • 最小限のコンテナーイメージが必要
  • 組み込みシステム、または対象環境が不明

次の場合は Bash(#!/bin/bash)を使います:

  • 環境が固定されている(特定の OS、コンテナー)
  • 配列または連想配列が必要
  • 高度なパラメーター展開が役立つ
  • プロセス置換 <(cmd) が役立つ

詳しい比較とテスト戦略については、references/portability-guide.md を参照してください。

基本的なエラー処理

即時終了パターン
#!/bin/bash
set -euo pipefail

# -e: Exit on error
# -u: Exit on undefined variable
# -o pipefail: Pipeline fails if any command fails

本番環境の自動化、CI/CD スクリプト、重要な操作に使用します。

終了コードの明示的な確認
#!/bin/bash

if ! command_that_might_fail; then
    echo "Error: Command failed" >&2
    exit 1
fi

独自のエラーメッセージや対話型スクリプトに使用します。

クリーンアップ用のトラップハンドラー
#!/bin/bash
set -euo pipefail

TEMP_FILE=$(mktemp)

cleanup() {
    rm -f "$TEMP_FILE"
}

trap cleanup EXIT

一時ファイル、ロック、リソースを確実にクリーンアップするために使用します。

エラーパターンの詳しい説明については、references/error-handling.md を参照してください。

引数解析

getopts を使った短いオプション(POSIX)
#!/bin/bash

while getopts "hvf:o:" opt; do
    case "$opt" in
        h) usage ;;
        v) VERBOSE=true ;;
        f) INPUT_FILE="$OPTARG" ;;
        o) OUTPUT_FILE="$OPTARG" ;;
        *) usage ;;
    esac
done

shift $((OPTIND - 1))
長いオプション(手動解析)
#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
        --help) usage ;;
        --verbose) VERBOSE=true; shift ;;
        --file) INPUT_FILE="$2"; shift 2 ;;
        --file=*) INPUT_FILE="${1#*=}"; shift ;;
        *) break ;;
    esac
done

ハイブリッドな方法と検証パターンについては、references/argument-parsing.md を参照してください。

パラメーター展開のクイックリファレンス

# Default values
${var:-default}              # Use default if unset
${var:=default}              # Assign default if unset
: "${API_KEY:?Error: required}"  # Error if unset

# String manipulation
${#var}                      # String length
${var:offset:length}         # Substring
${var%.txt}                  # Remove suffix
${var##*/}                   # Basename
${var/old/new}               # Replace first
${var//old/new}              # Replace all

# Case conversion (Bash 4+)
${var^^}                     # Uppercase
${var,,}                     # Lowercase

展開パターンと配列処理の全容については、references/parameter-expansion.md を参照してください。

一般的なユーティリティとの連携

jq での JSON 処理
# Extract field
name=$(curl -sSL https://api.example.com/user | jq -r '.name')

# Filter array
active=$(jq '.users[] | select(.active) | .name' data.json)

# Check existence
if ! echo "$json" | jq -e '.field' >/dev/null; then
    echo "Error: Field missing" >&2
fi
yq での YAML 処理
# Read value (yq v4)
host=$(yq eval '.database.host' config.yaml)

# Update in-place
yq eval '.port = 5432' -i config.yaml

# Convert to JSON
yq eval -o=json config.yaml
テキスト処理
# awk: Extract columns
awk -F',' '{print $1, $3}' data.csv

# sed: Replace text
sed 's/old/new/g' file.txt

# grep: Pattern match
grep -E "ERROR|WARN" logfile.txt

詳しい例とベストプラクティスについては、references/common-utilities.md を参照してください。

テストと検証

ShellCheck:静的解析
# Check script
shellcheck script.sh

# POSIX compliance
shellcheck --shell=sh script.sh

# Exclude warnings
shellcheck --exclude=SC2086 script.sh
Bats:自動テスト
#!/usr/bin/env bats

@test "script runs successfully" {
    run ./script.sh --help
    [ "$status" -eq 0 ]
    [ "${lines[0]}" = "Usage: script.sh [OPTIONS]" ]
}

@test "handles missing argument" {
    run ./script.sh
    [ "$status" -eq 1 ]
    [[ "$output" =~ "Error" ]]
}

テストを実行します:

bats test/

CI/CD との連携やデバッグ手法については、references/testing-guide.md を参照してください。

防御的プログラミングのチェックリスト

#!/bin/bash
set -euo pipefail

# Check required commands
command -v jq >/dev/null 2>&1 || {
    echo "Error: jq required" >&2
    exit 1
}

# Check environment variables
: "${API_KEY:?Error: API_KEY required}"

# Check files
[ -f "$CONFIG_FILE" ] || {
    echo "Error: Config not found: $CONFIG_FILE" >&2
    exit 1
}

# Quote all variables
echo "Processing: $file"        # ❌ Unquoted
echo "Processing: \"$file\""    # ✅ Quoted

プラットフォームに関する考慮事項

macOS と Linux の違い
# sed in-place
sed -i '' 's/old/new/g' file.txt    # macOS
sed -i 's/old/new/g' file.txt       # Linux

# Portable: Use temp file
sed 's/old/new/g' file.txt > file.txt.tmp
mv file.txt.tmp file.txt

# readlink
readlink -f /path                    # Linux only
cd "$(dirname "$0")" && pwd         # Portable

プラットフォームの違いの全容については、references/portability-guide.md を参照してください。

スクリプトのカテゴリ

システム管理: Cron ジョブ、ログローテーション、バックアップの自動化 ビルド/デプロイ: CI/CD パイプライン、Docker ビルド、デプロイ 開発ツール: プロジェクトのセットアップ、テストランナー、コード生成ツール コンテナーのエントリーポイント: 初期化、シグナル処理、設定

本番用スクリプトのテンプレート

#!/bin/bash
set -euo pipefail

readonly SCRIPT_NAME="$(basename "$0")"
readonly SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

TEMP_DIR=""

cleanup() {
    local exit_code=$?
    rm -rf "$TEMP_DIR"
    exit "$exit_code"
}

trap cleanup EXIT

log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" >&2
}

main() {
    # Check dependencies
    command -v jq >/dev/null 2>&1 || exit 1

    # Parse arguments
    # Validate input
    # Process
    # Report results

    log "Completed successfully"
}

main "$@"

本番用テンプレートの全容については、examples/production-template.sh を参照してください。

推奨ツール

主要ツール:

  • jq:JSON の解析と変換
  • yq:YAML の解析(v4 を推奨)
  • ShellCheck:静的解析とリンティング
  • Bats:自動テストフレームワーク

インストール:

# macOS
brew install jq yq shellcheck bats-core

# Ubuntu/Debian
apt-get install jq shellcheck

関連スキル

  • linux-administration:システムコマンドと管理
  • building-ci-pipelines:CI/CD でのスクリプトの使用
  • infrastructure-as-code:Terraform/Pulumi のラッパー
  • kubernetes-operations:kubectl スクリプト、Helm フック
  • writing-dockerfiles:コンテナーのエントリーポイント

追加リソース

リファレンスファイル:

  • references/error-handling.md - 包括的なエラーパターン
  • references/argument-parsing.md - 高度な解析手法
  • references/parameter-expansion.md - パラメーター展開の完全なリファレンス
  • references/portability-guide.md - POSIX と Bash の違い
  • references/testing-guide.md - ShellCheck と Bats のガイド
  • references/common-utilities.md - jq、yq、awk、sed の使用方法

サンプルスクリプト:

  • examples/production-template.sh - 本番環境対応テンプレート
  • examples/getopts-basic.sh - getopts のシンプルな使用例
  • examples/getopts-advanced.sh - 複雑なオプション処理
  • examples/long-options.sh - 手動での長いオプションの解析
  • examples/error-handling.sh - エラーハンドリングパターン
  • examples/json-yaml-processing.sh - jq/yq の使用例

ユーティリティスクリプト:

  • scripts/lint-script.sh - CI 用 ShellCheck ラッパー
  • scripts/test-script.sh - CI 用 Bats ラッパー

コメント