Claude-skill-registry bash-script

Write robust bash scripts with proper error handling. Use when the user says "write a script", "bash script", "shell script", "automate this", "create a backup script", or asks to script a task.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/bash-script" ~/.claude/skills/majiayu000-claude-skill-registry-bash-script && rm -rf "$T"
manifest: skills/data/bash-script/SKILL.md
source content

Bash Script

Write robust, maintainable bash scripts with proper error handling.

Instructions

  1. Understand the task requirements
  2. Design the script structure
  3. Write with safety options and error handling
  4. Test and validate

Script template

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

# Description: Brief description of what this script does
# Usage: ./script.sh [options] <args>

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"

# Default values
VERBOSE="${VERBOSE:-false}"

usage() {
    cat <<EOF
Usage: ${SCRIPT_NAME} [OPTIONS] <argument>

Description of what the script does.

Options:
    -h, --help      Show this help message
    -v, --verbose   Enable verbose output

Examples:
    ${SCRIPT_NAME} input.txt
    ${SCRIPT_NAME} --verbose /path/to/file
EOF
}

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

error() {
    log "ERROR: $*"
    exit 1
}

cleanup() {
    # Remove temp files, restore state, etc.
    rm -f "${TEMP_FILE:-}"
}
trap cleanup EXIT

main() {
    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case "$1" in
            -h|--help) usage; exit 0 ;;
            -v|--verbose) VERBOSE=true; shift ;;
            --) shift; break ;;
            -*) error "Unknown option: $1" ;;
            *) break ;;
        esac
    done

    [[ $# -lt 1 ]] && { usage; exit 1; }

    local input="$1"
    [[ -f "$input" ]] || error "File not found: $input"

    # Main logic here
    log "Processing $input"
}

main "$@"

Safety options explained

OptionPurpose
set -e
Exit on error
set -u
Error on undefined variables
set -o pipefail
Pipeline fails if any command fails
IFS=$'\n\t'
Safer word splitting

Best practices

  • MUST use
    set -euo pipefail
    at script start
  • MUST quote all variables:
    "$var"
    not
    $var
  • MUST use
    [[
    for conditionals (not
    [
    )
  • MUST use
    $()
    for command substitution (not backticks)
  • Use
    readonly
    for constants
  • Use
    local
    for function variables
  • Use
    trap
    for cleanup
  • Use
    mktemp
    for temp files

Common patterns

# Check if command exists
command -v docker &>/dev/null || error "docker not found"

# Default value
name="${1:-default}"

# Read file line by line
while IFS= read -r line; do
    echo "$line"
done < "$file"

# Process arguments
for arg in "$@"; do
    echo "$arg"
done

# Temp file with cleanup
TEMP_FILE="$(mktemp)"
trap 'rm -f "$TEMP_FILE"' EXIT

Rules

  • MUST include
    set -euo pipefail
  • MUST quote all variable expansions
  • MUST include usage function for scripts with arguments
  • MUST use trap for cleanup of temp files
  • Never use
    eval
    with user input
  • Never assume current directory
  • Always use absolute paths for cron scripts