bash-dev
Bash scripting development standards, error handling, and best practices. Activated when working with .sh files or Bash scripts.
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o bash-dev.zip https://jpskill.com/download/17713.zip && unzip -o bash-dev.zip && rm bash-dev.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/17713.zip -OutFile "$d\bash-dev.zip"; Expand-Archive "$d\bash-dev.zip" -DestinationPath $d -Force; ri "$d\bash-dev.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
bash-dev.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
bash-devフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Bash 開発エキスパート
このスキルは、ベストプラクティスと安全基準に基づいた Bash スクリプト開発をサポートします。
🎯 コア規則
Shebang と安全性
- Shebang: 常に
#!/usr/bin/env bashを使用してください。 - Set Options: 常に
set -euo pipefailを使用してください。-e: エラー時に終了します。-u: 未定義の変数の場合に終了します。-o pipefail: いずれかのコマンドが失敗した場合、パイプラインを失敗させます。
変数の扱い
- クォーティング: 常に変数をクォートしてください
"${var}" - 定数: グローバル/環境変数には UPPERCASE を使用してください。
- ローカル変数: 関数ローカル変数には lowercase を使用してください。
- Readonly: 定数には
readonlyを使用してください。
関数のベストプラクティス
- ローカル変数: 常に
localキーワードを使用してください。 - パラメータの検証: 必須パラメータを検証してください。
- リターンコード: 成功の場合は 0、エラーの場合は 0 以外を返してください。
- ドキュメント: 使用法、説明、およびリターンコードをドキュメント化してください。
📚 スクリプトテンプレート
標準スクリプト構造
#!/usr/bin/env bash
set -euo pipefail
# スクリプトメタデータ
# Usage: script_name.sh <arg1> [arg2]
# Description: このスクリプトの機能
# Author: あなたの名前
# Version: 1.0.0
# グローバル定数 (UPPERCASE)
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
readonly VERSION="1.0.0"
# 出力用のカラーコード
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly NC='\033[0m' # No Color
#######################################
# 使用法情報を表示する
# Globals:
# SCRIPT_NAME
# Arguments:
# None
# Outputs:
# 使用法を stdout に書き込む
#######################################
usage() {
cat <<EOF
Usage: ${SCRIPT_NAME} <arg1> [arg2]
Description:
このスクリプトが詳細に何をするか
Arguments:
arg1 必須引数の説明
arg2 オプション引数の説明 (default: value)
Options:
-h, --help このヘルプメッセージを表示する
-v, --version バージョン情報を表示する
Examples:
${SCRIPT_NAME} value1
${SCRIPT_NAME} value1 value2
EOF
}
#######################################
# エラーメッセージを出力して終了する
# Globals:
# RED, NC
# Arguments:
# エラーメッセージ
# Outputs:
# エラーを stderr に書き込む
# Returns:
# 1 (エラーコード)
#######################################
error() {
echo -e "${RED}Error: $*${NC}" >&2
exit 1
}
#######################################
# インフォメッセージを出力する
# Globals:
# GREEN, NC
# Arguments:
# インフォメッセージ
# Outputs:
# メッセージを stdout に書き込む
#######################################
info() {
echo -e "${GREEN}Info: $*${NC}"
}
#######################################
# 警告メッセージを出力する
# Globals:
# YELLOW, NC
# Arguments:
# 警告メッセージ
# Outputs:
# 警告を stdout に書き込む
#######################################
warn() {
echo -e "${YELLOW}Warning: $*${NC}"
}
#######################################
# メイン関数
# Globals:
# None
# Arguments:
# コマンドライン引数
# Returns:
# 成功時は 0、エラー時は 1
#######################################
main() {
local arg1="${1:?Error: arg1 required}"
local arg2="${2:-default_value}"
info "Processing: ${arg1}"
# ここにロジックを記述
info "Completed successfully"
return 0
}
# エラーハンドラ
trap 'error "Script failed on line $LINENO"' ERR
# 引数を解析
case "${1:-}" in
-h|--help)
usage
exit 0
;;
-v|--version)
echo "${SCRIPT_NAME} version ${VERSION}"
exit 0
;;
esac
# メイン関数を実行
main "$@"
🛠️ 一般的なパターン
エラー処理
# コマンドが存在するか確認
if ! command -v git &> /dev/null; then
error "git is not installed"
fi
# ファイルが存在するか確認
if [[ ! -f "${config_file}" ]]; then
error "Config file not found: ${config_file}"
fi
# ディレクトリが存在するか確認
if [[ ! -d "${target_dir}" ]]; then
mkdir -p "${target_dir}" || error "Failed to create directory"
fi
入力検証
# 必須引数を検証
validate_arg() {
local arg="${1:?Error: argument required}"
if [[ -z "${arg}" ]]; then
error "Argument cannot be empty"
fi
}
# 数値を検証
validate_number() {
local num="$1"
if ! [[ "${num}" =~ ^[0-9]+$ ]]; then
error "Invalid number: ${num}"
fi
}
ファイル操作
# 安全なファイル読み込み
read_file() {
local file="$1"
if [[ ! -r "${file}" ]]; then
error "Cannot read file: ${file}"
fi
cat "${file}"
}
# 安全なファイル書き込み
write_file() {
local file="$1"
local content="$2"
echo "${content}" > "${file}" || error "Failed to write file"
}
配列の扱い
# 配列を宣言
declare -a items=("item1" "item2" "item3")
# 配列を反復処理
for item in "${items[@]}"; do
echo "Processing: ${item}"
done
# 配列の長さ
echo "Total items: ${#items[@]}"
🎯 品質チェックリスト
コミットする前に以下を確認してください。
- [ ] Shebang
#!/usr/bin/env bashが存在すること - [ ]
set -euo pipefailが先頭にあること - [ ] すべての変数がクォートされていること
"${var}" - [ ] グローバル変数が UPPERCASE であること
- [ ] ローカル変数が
localキーワードを使用していること - [ ] 関数にドキュメントコメントがあること
- [ ] エラー処理が実装されていること
- [ ] 使用法関数が提供されていること
- [ ] 終了コードが意味のあるものであること (0=成功、0 以外=エラー)
- [ ] スクリプトが
shellcheckでテストされていること
🔍 避けるべき一般的なアンチパターン
❌ 避けるべきこと:
# クォートされていない変数
cd $HOME/dir
# エラー処理の欠如
mkdir /some/dir
# 未定義の変数
echo $UNDEFINED_VAR
# set options がない
#!/bin/bash
✅ 推奨:
# クォートされた変数
cd "${HOME}/dir" || error "Failed to change directory"
# エラー処理あり
mkdir -p "${target_dir}" || error "Failed to create directory"
# 使用前に確認
if [[ -n "${VAR:-}" ]]; then
echo "${VAR}"
fi
# 適切な set options
#!/usr/bin/env bash
set -euo pipefail
💡 テスト
ShellCheck の使用
# shellcheck をインストール
brew install shellcheck # macOS
# スクリプトをチェック
shellcheck script.sh
# 特定の警告を無視
# shellcheck disable=SC2086
command ${unquoted}
関数のテスト
# 簡単なテスト関数
test_function() {
local expected="exp 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Bash Development Expert
This skill supports Bash script development with best practices and safety standards.
🎯 Core Rules
Shebang and Safety
- Shebang: Always use
#!/usr/bin/env bash - Set Options: Always use
set -euo pipefail-e: Exit on error-u: Exit on undefined variable-o pipefail: Fail pipeline if any command fails
Variable Handling
- Quoting: Always quote variables
"${var}" - Constants: Use UPPERCASE for global/environment variables
- Local Variables: Use lowercase for function-local variables
- Readonly: Use
readonlyfor constants
Function Best Practices
- Local Variables: Always use
localkeyword - Parameter Validation: Validate required parameters
- Return Codes: 0 for success, non-zero for errors
- Documentation: Document usage, description, and return codes
📚 Script Template
Standard Script Structure
#!/usr/bin/env bash
set -euo pipefail
# Script metadata
# Usage: script_name.sh <arg1> [arg2]
# Description: What this script does
# Author: Your Name
# Version: 1.0.0
# Global constants (UPPERCASE)
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
readonly VERSION="1.0.0"
# Color codes for output
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly NC='\033[0m' # No Color
#######################################
# Display usage information
# Globals:
# SCRIPT_NAME
# Arguments:
# None
# Outputs:
# Writes usage to stdout
#######################################
usage() {
cat <<EOF
Usage: ${SCRIPT_NAME} <arg1> [arg2]
Description:
What this script does in detail
Arguments:
arg1 Required argument description
arg2 Optional argument description (default: value)
Options:
-h, --help Show this help message
-v, --version Show version information
Examples:
${SCRIPT_NAME} value1
${SCRIPT_NAME} value1 value2
EOF
}
#######################################
# Print error message and exit
# Globals:
# RED, NC
# Arguments:
# Error message
# Outputs:
# Writes error to stderr
# Returns:
# 1 (error code)
#######################################
error() {
echo -e "${RED}Error: $*${NC}" >&2
exit 1
}
#######################################
# Print info message
# Globals:
# GREEN, NC
# Arguments:
# Info message
# Outputs:
# Writes message to stdout
#######################################
info() {
echo -e "${GREEN}Info: $*${NC}"
}
#######################################
# Print warning message
# Globals:
# YELLOW, NC
# Arguments:
# Warning message
# Outputs:
# Writes warning to stdout
#######################################
warn() {
echo -e "${YELLOW}Warning: $*${NC}"
}
#######################################
# Main function
# Globals:
# None
# Arguments:
# Command line arguments
# Returns:
# 0 on success, 1 on error
#######################################
main() {
local arg1="${1:?Error: arg1 required}"
local arg2="${2:-default_value}"
info "Processing: ${arg1}"
# Your logic here
info "Completed successfully"
return 0
}
# Error handler
trap 'error "Script failed on line $LINENO"' ERR
# Parse arguments
case "${1:-}" in
-h|--help)
usage
exit 0
;;
-v|--version)
echo "${SCRIPT_NAME} version ${VERSION}"
exit 0
;;
esac
# Execute main function
main "$@"
🛠️ Common Patterns
Error Handling
# Check if command exists
if ! command -v git &> /dev/null; then
error "git is not installed"
fi
# Check if file exists
if [[ ! -f "${config_file}" ]]; then
error "Config file not found: ${config_file}"
fi
# Check if directory exists
if [[ ! -d "${target_dir}" ]]; then
mkdir -p "${target_dir}" || error "Failed to create directory"
fi
Input Validation
# Validate required argument
validate_arg() {
local arg="${1:?Error: argument required}"
if [[ -z "${arg}" ]]; then
error "Argument cannot be empty"
fi
}
# Validate number
validate_number() {
local num="$1"
if ! [[ "${num}" =~ ^[0-9]+$ ]]; then
error "Invalid number: ${num}"
fi
}
File Operations
# Safe file read
read_file() {
local file="$1"
if [[ ! -r "${file}" ]]; then
error "Cannot read file: ${file}"
fi
cat "${file}"
}
# Safe file write
write_file() {
local file="$1"
local content="$2"
echo "${content}" > "${file}" || error "Failed to write file"
}
Array Handling
# Declare array
declare -a items=("item1" "item2" "item3")
# Iterate over array
for item in "${items[@]}"; do
echo "Processing: ${item}"
done
# Array length
echo "Total items: ${#items[@]}"
🎯 Quality Checklist
Check these before committing:
- [ ] Shebang
#!/usr/bin/env bashpresent - [ ]
set -euo pipefailat the beginning - [ ] All variables quoted
"${var}" - [ ] Global variables in UPPERCASE
- [ ] Local variables use
localkeyword - [ ] Functions have documentation comments
- [ ] Error handling implemented
- [ ] Usage function provided
- [ ] Exit codes are meaningful (0=success, non-zero=error)
- [ ] Script tested with
shellcheck
🔍 Common Anti-patterns to Avoid
❌ Don't:
# Unquoted variables
cd $HOME/dir
# Missing error handling
mkdir /some/dir
# Undefined variables
echo $UNDEFINED_VAR
# No set options
#!/bin/bash
✅ Do:
# Quoted variables
cd "${HOME}/dir" || error "Failed to change directory"
# With error handling
mkdir -p "${target_dir}" || error "Failed to create directory"
# Check before use
if [[ -n "${VAR:-}" ]]; then
echo "${VAR}"
fi
# Proper set options
#!/usr/bin/env bash
set -euo pipefail
💡 Testing
Using ShellCheck
# Install shellcheck
brew install shellcheck # macOS
# Check script
shellcheck script.sh
# Ignore specific warnings
# shellcheck disable=SC2086
command ${unquoted}
Testing Functions
# Simple test function
test_function() {
local expected="expected_value"
local actual
actual="$(your_function)"
if [[ "${actual}" != "${expected}" ]]; then
error "Test failed: expected '${expected}', got '${actual}'"
fi
info "Test passed"
}