jpskill.com
🛠️ 開発・MCP コミュニティ

bash-dev

Bash scripting development standards, error handling, and best practices. Activated when working with .sh files or Bash scripts.

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
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
🪟 Windows (PowerShell)
$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. 1. 下の青いボタンを押して bash-dev.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → bash-dev フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

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 readonly for constants

Function Best Practices

  • Local Variables: Always use local keyword
  • 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 bash present
  • [ ] set -euo pipefail at the beginning
  • [ ] All variables quoted "${var}"
  • [ ] Global variables in UPPERCASE
  • [ ] Local variables use local keyword
  • [ ] 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"
}