Tag: bash, shell, scripting, linux, terminal, cli
Livello: intermedio
TL;DR: Sintassi, comandi essenziali e best practice per lo scripting in Bash. Rapido riferimento per automazione e gestione di processi, variabili e stream.
Lo shebang #!/bin/bash definisce l'interprete per l'esecuzione dello script
Le variabili non sono tipizzate e l'assegnazione vieta gli spazi (es. VAR=valore)
Lo scope delle variabili è globale di default; si usa local all'interno delle funzioni
$? contiene il codice di uscita dell'ultimo comando (0 indica successo, >0 indica errore)
Gli stream standard principali sono stdin (0), stdout (1) e stderr (2)
Le pipe | passano lo stdout di un comando come stdin del comando successivo
La redirezione > sovrascrive un file, >> appende l'output alla fine del file
La sintassi 2>&1 reindirizza lo stderr verso lo stdout
Le condizioni usano [[ ]] (nativo bash) che è più sicuro, tollera variabili vuote e supporta il pattern matching rispetto al vecchio [ ]
Q: Qual è la differenza tra $@ e $* in Bash?R: Entrambi rappresentano gli argomenti passati; ma racchiusi tra virgolette, "$@" li espande come argomenti separati, mentre "$*" li espande come un'unica stringa unita dal primo carattere della variabile IFS.
Q: Come gestisci gli errori in uno script Bash in modo robusto?R: Inserisco all'inizio set -e per interromperlo al primo errore, set -u per fallire su variabili non definite e set -o pipefail per intercettare errori nascosti all'interno delle pipe.
Q: Come fai in modo che uno script venga eseguito in background e sopravviva al logout?R: Uso il comando nohup ./script.sh & per sganciarlo dal terminale, oppure lo eseguo all'interno di un multiplexer come tmux o screen.
Inserire spazi nell'assegnazione delle variabili (es. NOME = "Umberto") causando l'errore "command not found"
Dimenticare le doppie virgolette attorno alle variabili, scatenando comportamenti anomali con spazi e word splitting
Usare il test POSIX [ ] invece di [[ ]], perdendo funzionalità avanzate ed esponendo lo script a bug sintattici se le variabili sono vuote
Non configurare set -e negli script di deploy o automazione, permettendo all'esecuzione di proseguire rovinosamente in uno stato di errore
# Template iniziale robusto (Strict Mode)
#!/bin/bash
set -euo pipefail
IFS=#39;\n\t'
# Iterare sui file di una directory in modo sicuro
for file in *.txt; do
echo "Elaboro il file: $file"
done
# Lettura corretta riga per riga da un file
while IFS= read -r line; do
echo "Riga: $line"
done < input.txt
# Controllo condizionale su directory e file
if [[ -d "/percorso/dir" ]]; then
echo "La directory esiste"
elif [[ -f "/percorso/file.txt" ]]; then
echo "Il file esiste"
else
echo "Nessuno dei due trovato"
fi
# Sostituzione di comando
DATA_ODIERNA=$(date +%Y-%m-%d)
Da ripassare
[ ] Espansione dei parametri e manipolazione stringhe nativa (${var%pattern}, ${var/find/replace})
[ ] Gestione dei segnali e uso del comando trap per eseguire il cleanup all'uscita dello script
[ ] Differenza comportamentale e di subshell tra ( comandi ) e { comandi; }