shell-scripting

CodingKaiser's avatarfrom CodingKaiser

Specialized knowledge of Bash and Zsh scripting, shell automation, command-line tools, and scripting best practices. Use when the user needs to write, debug, or optimize shell scripts, work with command-line tools, automate tasks with bash/zsh, or asks for shell script help.

⭐0stars🔀1forks📁View on GitHub🕐Updated Dec 16, 2025

When & Why to Use This Skill

This Claude skill provides expert guidance for Bash and Zsh scripting, enabling users to create robust, maintainable, and secure shell scripts. It covers automation best practices, command-line tool optimization, and modern CLI alternatives to streamline development and system administration tasks.

Use Cases

  • Automating repetitive system tasks like log rotation, backups, or environment setup using robust Bash templates.
  • Debugging complex shell scripts by implementing strict error handling (set -euo pipefail) and identifying common pitfalls like unquoted variables.
  • Efficiently processing files and JSON data on the command line using integrated tools like jq, find, and xargs.
  • Creating portable CI/CD pipeline scripts or deployment runbooks that follow industry-standard security and performance best practices.
nameshell-scripting
descriptionSpecialized knowledge of Bash and Zsh scripting, shell automation, command-line tools, and scripting best practices. Use when the user needs to write, debug, or optimize shell scripts, work with command-line tools, automate tasks with bash/zsh, or asks for shell script help.

Shell Scripting Expert

Expert guidance for writing robust, maintainable Bash and Zsh scripts with best practices for automation and command-line tool usage.

Script Structure Essentials

Start every script with:

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
  • set -e: Exit on error
  • set -u: Error on undefined variables
  • set -o pipefail: Catch errors in pipes
  • IFS=$'\n\t': Safer word splitting

Critical Best Practices

  1. Always quote variables: "$variable" not $variable
  2. Use [[ for conditionals (Bash): if [[ "$var" == "value" ]]; then
  3. Check command existence: if command -v git &> /dev/null; then
  4. Avoid parsing ls: Use globs or find instead
  5. Use arrays for lists: files=("file1" "file2") not space-separated strings
  6. Handle errors with traps:
    trap cleanup EXIT
    trap 'echo "Error on line $LINENO"' ERR
    

Common Patterns

Argument Parsing

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

Safe File Iteration

# Prefer this (handles spaces, newlines correctly):
while IFS= read -r -d '' file; do
    echo "Processing: $file"
done < <(find . -type f -name "*.txt" -print0)

# Or with simple globs:
for file in *.txt; do
    [[ -e "$file" ]] || continue  # Skip if no matches
    echo "Processing: $file"
done

User Confirmation

read -rp "Continue? [y/N] " response
if [[ "$response" =~ ^[Yy]$ ]]; then
    echo "Continuing..."
fi

Colored Output

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'  # No Color

echo -e "${GREEN}Success${NC}"
echo -e "${RED}Error${NC}" >&2

Modern Tool Alternatives

When appropriate, suggest these modern replacements:

  • ripgrep (rg) → faster than grep
  • fd → faster than find
  • fzf → interactive filtering
  • jq → JSON processing
  • yq → YAML processing
  • bat → cat with syntax highlighting
  • eza → enhanced ls

Function Organization

usage() {
    cat <<EOF
Usage: ${0##*/} [OPTIONS] <args>
Description of what this script does.
OPTIONS:
    -h, --help      Show this help
    -v, --verbose   Verbose output
EOF
}

main() {
    # Main logic here
    :
}

Snakemake & Shells

  • Snakemake uses Bash: By default, Snakemake executes shell: directives using /bin/bash -euo pipefail.
  • Write Bash, not Fish: Even if your terminal is Fish, write rule commands in standard Bash syntax.
  • Strict Mode: Snakemake enables strict mode automatically.

Zsh-Specific Features

When user specifies Zsh:

  • Advanced globbing: **/*.txt (recursive), *.txt~*test* (exclude pattern)
  • Parameter expansion: ${var:u} (uppercase), ${var:l} (lowercase)
  • Associative arrays: typeset -A hash; hash[key]=value
  • Extended globbing: Enable with setopt extended_glob

Security Considerations

  • Never eval untrusted input
  • Validate user input before use
  • Use mktemp for temporary files: TEMP_FILE=$(mktemp)
  • Be explicit with rm -rf operations
  • Check for TOCTOU (Time-Of-Check-Time-Of-Use) race conditions
  • Don't store secrets in scripts; use environment variables or secret managers

Performance Tips

  • Use built-ins over external commands ([[ ]] vs test, $(( )) vs expr)
  • Avoid unnecessary subshells: var=$(cat file) → var=$(<file)
  • Use read not cat | while: while read -r line; do ... done < file
  • Consider xargs -P or GNU parallel for parallel processing

Quick Reference Template

See references/template.sh for a complete, production-ready script template with all best practices incorporated.