shell-scripting について
shell-scriptingは、保守しやすいシェルスクリプトを書くためのスキルで、コマンドライン作業を自動化する開発者や運用担当者向けです。移植性、エラー処理、引数解析、ユーティリティ連携に加え、ShellCheckとBatsによる検証を扱います。
主な機能
- 01POSIX shとBashの選択指針
- 02エラー処理とクリーンアップのパターン
- 03短縮・長形式オプションの解析
- 04jq、yq、テキスト処理ツールの例
- 05ShellCheckとBatsによるテスト指針
活用シーン
- 01CI/CDパイプライン作業の自動化
- 02コンテナのエントリーポイント作成
- 03バックアップやログローテーションのジョブ作成
- 04プロジェクト用スクリプトやテストランナーの構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ancoleman/ ai-design-components --skill shell-scriptingインストール後、Claude Code で/shell-scriptingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
outputs.yamlexamples/error-handling.shgetopts-advanced.shgetopts-basic.shjson-yaml-processing.shlong-options.shproduction-template.shreferences/argument-parsing.mdcommon-utilities.mderror-handling.mdparameter-expansion.mdportability-guide.mdtesting-guide.mdscripts/lint-script.shtest-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 ラッパー