Bash Scripting
Script Template
#!/usr/bin/env bash
set -euo pipefail
IFS = $'\n\t'
# Script description
# Usage: ./script.sh <arg1> <arg2>
readonly SCRIPT_DIR = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
main() {
local arg1 = " ${ 1 :- default } "
# Script logic here
echo "Running with: $arg1 "
}
main " $@ "
Safety Settings
set -e # Exit on error
set -u # Error on undefined variables
set -o pipefail # Catch pipe failures
set -x # Debug: print commands
Variables
# Declaration
readonly CONST = "immutable"
local var = "function scoped"
# Default values
name = " ${ 1 :- default } " # Use default if unset
name = " ${ 1 :?Error: missing } " # Error if unset
# String operations
" ${ var ^^ } " # Uppercase
" ${ var ,, } " # Lowercase
" ${ var #prefix } " # Remove prefix
" ${ var %suffix } " # Remove suffix
Conditionals
# File tests
[[ -f " $file " ]] # Is file
[[ -d " $dir " ]] # Is directory
[[ -r " $file " ]] # Is readable
[[ -x " $file " ]] # Is executable
# String tests
[[ -z " $var " ]] # Is empty
[[ -n " $var " ]] # Is not empty
[[ " $a " == " $b " ]] # Equals
# Numeric tests
(( num > 5 )) # Greater than
(( num == 5 )) # Equals
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
# Trap for cleanup
cleanup() {
rm -rf " $TMP_DIR "
}
trap cleanup EXIT
# Catch errors
if ! result = $( some_command 2 >& 1 ) ; then
die "Command failed: $result "
fi
Loops
# For loop
for item in " ${ array [@] } " ; do
echo " $item "
done
# While read
while IFS = read -r line; do
echo " $line "
done < file.txt
# Process substitution
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