Claude-skill-registry bash-basics
Production-grade Bash fundamentals - syntax, variables, control flow, functions
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-basics" ~/.claude/skills/majiayu000-claude-skill-registry-bash-basics && rm -rf "$T"
manifest:
skills/data/bash-basics/SKILL.mdsource content
Bash Basics Skill
Master the fundamentals of Bash shell scripting with production-ready patterns
Learning Objectives
After completing this skill, you will be able to:
- Write syntactically correct Bash scripts
- Use variables with proper quoting and expansion
- Implement control flow structures (if, case, loops)
- Design reusable functions with error handling
- Apply the strict mode (
)set -euo pipefail
Prerequisites
- Basic command line familiarity
- Text editor (vim, nano, or IDE)
- Linux/macOS/WSL environment
- Bash 4.0+ installed
Core Concepts
1. Script Structure
#!/usr/bin/env bash # Script: example.sh # Purpose: Demonstrate basic structure # Usage: ./example.sh [options] set -euo pipefail # Strict mode IFS=$'\n\t' # Safe IFS # Constants readonly VERSION="1.0.0" # Main logic main() { echo "Hello, World!" } main "$@"
2. Variables
# Declaration name="value" # String declare -i count=0 # Integer declare -r CONST="immutable" # Readonly declare -a array=("a" "b" "c") # Array declare -A map=([key]="val") # Associative array # Expansion echo "${name}" # Basic echo "${name:-default}" # Default if unset echo "${name:?error msg}" # Error if unset echo "${#name}" # Length echo "${name^^}" # Uppercase echo "${name,,}" # Lowercase
3. Control Structures
# Conditionals if [[ -f "$file" ]]; then echo "File exists" elif [[ -d "$file" ]]; then echo "Directory exists" else echo "Not found" fi # Case statements case "$option" in start) do_start ;; stop) do_stop ;; *) echo "Unknown" ;; esac # Loops for item in "${array[@]}"; do echo "$item" done while read -r line; do process "$line" done < file.txt
4. Functions
function greet() { local name="${1:?Name required}" echo "Hello, $name!" } # With return values function add() { local a="${1:-0}" local b="${2:-0}" echo $((a + b)) } result=$(add 5 3)
Common Patterns
Error Handling Pattern
die() { printf 'ERROR: %s\n' "$1" >&2 exit "${2:-1}" } try_command() { if ! "$@"; then die "Command failed: $*" fi }
Argument Parsing Pattern
while [[ $# -gt 0 ]]; do case "$1" in -h|--help) usage; exit 0 ;; -v|--verbose) VERBOSE=true; shift ;; --) shift; break ;; -*) die "Unknown option: $1" ;; *) break ;; esac done
Anti-Patterns
| Don't | Do | Why |
|---|---|---|
| | Parsing ls breaks on spaces |
| | Backticks don't nest |
| | Unquoted vars break |
| | cd can fail silently |
Practice Exercises
- Hello Script: Write a script that greets by name
- File Counter: Count files in a directory by extension
- Backup Script: Create timestamped backups
- Config Parser: Parse key=value config files
Troubleshooting
Common Errors
| Error | Cause | Fix |
|---|---|---|
| Using undefined var | Use |
| Missing quotes | Check bracket matching |
| PATH issue | Use full path |
| Not executable | |
Debug Techniques
# Enable trace set -x # Verbose PS4 export PS4='+(${BASH_SOURCE}:${LINENO}): ' # Shellcheck shellcheck script.sh