| name | shell-scripting |
| description | Bash and Zsh scripting patterns with built-in logging and non-interactive execution. Use when writing automation scripts, CLI tools, or system administration tasks. |
Shell Scripting
Script Template
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_NAME="$(basename "$0")"
LOG_FILE="${LOG_FILE:-/tmp/${SCRIPT_NAME%.*}.log}"
log() { printf '%s [%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" "$2" | tee -a "$LOG_FILE"; }
info() { log "INFO" "$1"; }
warn() { log "WARN" "$1"; }
error() { log "ERROR" "$1" >&2; }
die() { error "$1"; exit 1; }
usage() {
cat <<EOF
Usage: $SCRIPT_NAME <required_arg> [optional_arg]
-h, --help Show this help
-y, --yes Skip confirmations (default: true)
-v, --verbose Enable debug output
EOF
exit 0
}
YES=true
VERBOSE=false
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help) usage ;;
-y|--yes) YES=true; shift ;;
-v|--verbose) VERBOSE=true; set -x; shift ;;
--) shift; break ;;
-*) die "Unknown option: $1" ;;
*) break ;;
esac
done
[[ $# -lt 1 ]] && die "Missing required argument. Use -h for help."
ARG1="$1"
ARG2="${2:-default_value}"
main() {
info "Starting: $ARG1"
info "Completed successfully"
}
main "$@"
Essential Options
set -e
set -u
set -o pipefail
set -x
Non-Interactive Patterns
rm -rf "$DIR"
RESPONSE="${RESPONSE:-yes}"
mysql -u root <<< "SELECT 1;"
timeout 30 curl -s "$URL" || die "Request timed out"
git --no-pager log -10
aws ec2 describe-instances --no-cli-pager
Zsh Compatibility
setopt extended_glob
rm -f **/*.tmp(N)
arr=(one two three)
for item in "${arr[@]}"; do echo "$item"; done
typeset -A map
map[key]=value
Common Patterns
command -v docker &>/dev/null || die "docker required"
cleanup() { [[ -f "$TMPFILE" ]] && rm -f "$TMPFILE"; }
trap cleanup EXIT
TMPFILE=$(mktemp)
retry() {
local n=0 max=3 delay=2
while ! "$@"; do
((n++)) && ((n >= max)) && return 1
info "Retry $n/$max in ${delay}s..."
sleep $delay
((delay *= 2))
done
}
parallel_run() {
local pids=()
for cmd in "$@"; do
eval "$cmd" & pids+=($!)
done
for pid in "${pids[@]}"; do wait "$pid" || return 1; done
}
String Operations
${var:0:5}
${var: -3}
${var/old/new}
${var//old/new}
${var#prefix}
${var%suffix}
${var:-default}
${var:?error}
Testing
[[ -f "$file" ]]
[[ -d "$dir" ]]
[[ -z "$var" ]]
[[ -n "$var" ]]
[[ "$a" == "$b" ]]
[[ "$a" -eq "$b" ]]
[[ -t 0 ]]