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
}