Shell Scripting Guide

Script Template

#!/usr/bin/env bash set -euo pipefail # exit on error, undefined vars, pipe fail IFS=$'\n\t' # Script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" main() { local name="${1:-World}" echo "Hello, $name!" } main "$@"

Variables & Strings

name="Alice" greeting="Hello, $name" # Default value port="${PORT:-8080}" # String operations file="photo.tar.gz" echo "${file%.gz}" # photo.tar (remove suffix) echo "${file%%.*}" # photo (remove all after .) echo "${file#photo.}" # tar.gz (remove prefix) echo "${#file}" # 11 (length) echo "${file/photo/img}" # img.tar.gz (replace)

Arrays

arr=(one two three four) echo "${arr[0]}" # one echo "${arr[@]}" # all elements echo "${#arr[@]}" # 4 (length) arr+=("five") # append # Iterate for item in "${arr[@]}"; do echo "$item" done # Associative array (Bash 4+) declare -A map map["key"]="value" echo "${map[key]}"

Functions

log() { local level="$1"; shift echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" >&2 } retry() { local attempts="${1:-3}"; shift local cmd=("$@") for ((i=1; i<=attempts; i++)); do "${cmd[@]}" && return 0 log WARN "Attempt $i/$attempts failed" sleep $((i * 2)) done return 1 }