🟢 Beginner

Bash Scripting — Automatizácia pre DevOps

Bash je predvolený shell na väčšine Linuxových systémov a základný automatizačný nástroj. Každý DevOps inžinier musí vedieť písať spoľahlivé skripty — od jednoduchých one-linerov po komplexné deployment pipeline.


Základy robustného skriptu

Každý produkčný skript by mal začínať takto:

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

Čo to robí:

  • set -e — skript sa zastaví pri prvej chybe
  • set -u — neexistujúca premenná = chyba (žiadne tiché prázdne stringy)
  • set -o pipefail — chyba v pipe sa propaguje (nie len posledný príkaz)
  • IFS=$'\n\t' — bezpečnejšie delimitery pre for cykly

Premenné a parametre

# Premenné s default hodnotami
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
ENVIRONMENT="${1:?Error: environment argument required}"

# Readonly premenné
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly LOG_FILE="/var/log/deploy.log"

Funkcie a error handling

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

cleanup() {
    local exit_code=$?
    log "Cleanup: removing temp files"
    rm -rf "${TEMP_DIR:-}"
    exit "$exit_code"
}
trap cleanup EXIT ERR

die() {
    log "FATAL: $*" >&2
    exit 1
}

# Použitie
check_dependency() {
    command -v "$1" &>/dev/null || die "$1 nie je nainštalovaný"
}

check_dependency docker
check_dependency jq

Praktické vzory

Bezpečné spracovanie súborov

# Nikdy nepoužívaj `for f in $(ls)` — zlyhá na medzerách
while IFS= read -r -d '' file; do
    echo "Processing: $file"
done < <(find /data -name "*.csv" -print0)

Retry logika

retry() {
    local max_attempts="${1:-3}"
    local delay="${2:-5}"
    shift 2
    local attempt=1

    until "$@"; do
        if (( attempt >= max_attempts )); then
            die "Command failed after $max_attempts attempts: $*"
        fi
        log "Attempt $attempt failed, retrying in ${delay}s..."
        sleep "$delay"
        (( attempt++ ))
    done
}

retry 3 5 curl -sf https://api.example.com/health

Paralelné spracovanie

# Parallel execution s limitom
MAX_JOBS=4
for server in "${SERVERS[@]}"; do
    deploy_to "$server" &
    # Počkaj ak beží príliš veľa jobov
    (( $(jobs -rp | wc -l) >= MAX_JOBS )) && wait -n
done
wait

Debugging

# Zapnúť debug výpis
set -x          # alebo bash -x script.sh

# Debug len časti skriptu
set -x
problematic_function
set +x

# Verbose mód
bash -v script.sh

Best Practices

  • Vždy set -euo pipefail — nikdy nie bez toho v produkcii
  • Quoting: "$variable" — vždy v úvodzovkách, okrem špeciálnych prípadov
  • Používaj funkcie — čitateľnejšie a testovateľnejšie
  • Trap na cleanup — dočasné súbory, lock files, notifikácie
  • ShellCheckshellcheck script.sh odhalí bežné chyby
  • Loguj všetko — timestamp + stdout aj stderr do log súboru
  • Ak je skript > 200 riadkov — zvá Python alebo Go

Bash je rýchly a všade dostupný. Nauč sa ho písať bezpečne a automatizuj všetko, čo sa opakuje.