Bash Scripting
Script Template
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
main() {
local arg1="${1:-default}"
echo "Running with: $arg1"
}
main "$@"
Safety Settings
set -e
set -u
set -o pipefail
set -x
Variables
readonly CONST="immutable"
local var="function scoped"
name="${1:-default}"
name="${1:?Error: missing}"
"${var^^}"
"${var,,}"
"${var#prefix}"
"${var%suffix}"
Conditionals
[[ -f "$file" ]]
[[ -d "$dir" ]]
[[ -r "$file" ]]
[[ -x "$file" ]]
[[ -z "$var" ]]
[[ -n "$var" ]]
[[ "$a" == "$b" ]]
(( num > 5 ))
(( num == 5 ))
Functions
log() {
local level="$1"
local message="$2"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $message" >&2
}
die() {
log "ERROR" "$1"
exit 1
}
require_command() {
command -v "$1" >/dev/null 2>&1 || die "Required command not found: $1"
}
Error Handling
cleanup() {
rm -rf "$TMP_DIR"
}
trap cleanup EXIT
if ! result=$(some_command 2>&1); then
die "Command failed: $result"
fi
Loops
for item in "${array[@]}"; do
echo "$item"
done
while IFS= read -r line; do
echo "$line"
done < file.txt
while read -r line; do
echo "$line"
done < <(command)
Best Practices
- Quote all variables:
"$var"
- Use
[[ instead of [
- Use
local in functions
- Use
readonly for constants
- Always use
set -euo pipefail
- Use shellcheck for linting