Bash automatizza operazioni ripetitive (backup, monitoraggio, gestione utenti) riducendo errori e tempo. Questa guida copre i pattern essenziali con codice pronto all’uso.
Prerequisiti
- Linux con Bash ≥ 4.x — verifica con
bash --version - Familiarità con:
grep,awk,sed,find,cron - Sudo/root per operazioni di sistema
Struttura Base
Ogni script professionale inizia così:
#!/bin/bash
set -euo pipefail
LOG_FILE="/var/log/sistema_info.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "Hostname: $(hostname)"
log "Uptime: $(uptime -p)"
set -euo pipefail: -e esce in caso di errore, -u tratta variabili non definite come errori, pipefail propaga errori nelle pipe.
Step 1: Variabili e Validazione Input
#!/bin/bash
set -euo pipefail
[[ $# -ne 2 ]] && { echo "Uso: $0 <utente> <gruppo>" >&2; exit 1; }
UTENTE="$1"
GRUPPO="$2"
Usa sempre virgolette doppie sulle variabili. Valida $# prima di usare $1, $2, ecc.
Step 2: Backup Automatizzato
#!/bin/bash
set -euo pipefail
SORGENTE="/var/www/html"
DESTINAZIONE="/backup"
NOME_BACKUP="backup_www_$(date '+%Y%m%d_%H%M%S').tar.gz"
mkdir -p "$DESTINAZIONE"
tar -czf "${DESTINAZIONE}/${NOME_BACKUP}" \
--exclude='*.log' \
"$SORGENTE"
find "$DESTINAZIONE" -name 'backup_www_*.tar.gz' -mtime +30 -delete
echo "Backup: ${NOME_BACKUP}"
Step 3: Monitoraggio Risorse
#!/bin/bash
set -euo pipefail
SOGLIA_DISCO=85
SOGLIA_CPU=90
EMAIL="admin@esempio.it"
controlla_disco() {
local USO
USO=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
[[ $USO -gt $SOGLIA_DISCO ]] && \
echo "ALERT: Disco al ${USO}%" | mail -s "Alert Disco" "$EMAIL"
}
controlla_cpu() {
local CPU
CPU=$(top -bn1 | grep 'Cpu(s)' | awk '{print int($2)}')
[[ $CPU -gt $SOGLIA_CPU ]] && \
echo "ALERT: CPU al ${CPU}%" | mail -s "Alert CPU" "$EMAIL"
}
controlla_disco
controlla_cpu
Pianifica con cron ogni 15 minuti:
*/15 * * * * /usr/local/bin/monitor_risorse.sh >> /var/log/monitor.log 2>&1
Step 4: Gestione Utenti
#!/bin/bash
set -euo pipefail
crea_utente() {
local NOME="$1"
local GRUPPO="$2"
local SHELL="${3:-/bin/bash}"
if id "$NOME" &>/dev/null; then
echo "Utente $NOME esiste già."; return 0
fi
useradd -m -s "$SHELL" -G "$GRUPPO" "$NOME"
echo "${NOME}:ChangeMe123!" | chpasswd
passwd -e "$NOME"
echo "Utente $NOME creato."
}
crea_utente "mario" "developers"
crea_utente "anna" "sysadmin" "/bin/zsh"
id "$NOME" &>/dev/null rende lo script idempotente: nessun errore se l’utente esiste già. passwd -e forza il cambio password al primo accesso.
Step 5: Parsing dei Log
#!/bin/bash
set -euo pipefail
LOG_AUTH="/var/log/auth.log"
REPORT="/tmp/report_accessi.txt"
{
echo "=== Report Accessi Falliti ==="
echo "Generato: $(date)"
echo ""
echo "Top 10 IP sospetti:"
grep 'Failed password' "$LOG_AUTH" | \
awk '{print $(NF-3)}' | \
sort | uniq -c | \
sort -rn | head -10
} > "$REPORT"
cat "$REPORT"
Troubleshooting
Debug con set -x
#!/bin/bash set -x # abilita: stampa ogni comando prima di eseguirlo VAR="test" echo "Valore: $VAR" set +x # disabilita
Problemi comuni
- Permessi mancanti:
chmod +x script.sh - Fine riga Windows (CRLF):
dos2unix script.sh - Variabili non espanse: usa virgolette doppie, non singole
- Pipe silenziose:
set -o pipefailobbligatorio - Script bloccato su stdin: aggiungi
< /dev/nullo flag-yal comando
ShellCheck
# Installazione apt install shellcheck # Debian/Ubuntu yum install shellcheck # CentOS/RHEL # Analisi shellcheck mio_script.sh
Best Practice
- Versionamento: Git per tutti gli script
- Logging strutturato: funzione
log()con timestamp e livello di severità - Idempotenza: script rieseguibili senza effetti collaterali
- Lock file:
flockper evitare esecuzioni parallele - Secrets: mai hardcodare password; usa variabili d’ambiente o vault

