Bash — Cheat Sheet

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.

Concetti chiave

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 [ ]

Domande tipiche e risposte pronte

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.

Insidie e errori comuni

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

Snippet e comandi

# 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; }

Jarvis Interviews
Jarvis