Shell Scripting — Cheat Sheet

Tag: bash, shell, linux, scripting, automation, devops

Livello: intermedio

TL;DR: Sintassi essenziale Bash, gestione flussi, pipeline e pattern di robustezza per automazioni e script di sistema.

Concetti chiave

Shebang definisce l'interprete di esecuzione dello script (#!/usr/bin/env bash).

Exit status 0 indica successo, qualsiasi valore tra 1 e 255 segnala errore.

set -euo pipefail impone arresto su errori, variabili non dichiarate e fallimenti nelle pipe.

Le variabili si assegnano senza spazi attorno a = e si referenziano con ${VAR}.

Le parentesi doppie [[ ... ]] offrono espressioni condizionali avanzate, regex e confronto stringhe sicuro.

La command substitution si esegue preferibilmente con $(comando) invece dei backtick.

Redirezione: > sovrascrive stdout, >> appende stdout, 2>&1 unisce stderr a stdout.

trap intercetta segnali POSIX (SIGINT, SIGTERM, EXIT) per routine di pulizia e cleanup.

File descriptor standard: 0 stdin, 1 stdout, 2 stderr.

Quoting a doppi apici "" permette l'espansione, singoli apici '' mantengono la stringa letterale.

Domande tipiche e risposte pronte

Q: Perché si usa set -euo pipefail all'inizio degli script?R: Rende lo script difensivo: -e interrompe l'esecuzione al primo errore, -u fallisce se uso variabili non inizializzate, -o pipefail propaga l'exit code d'errore all'interno delle pipeline.

Q: Qual è la differenza sostanziale tra [ e [[ in Bash?R: [ è un built-in POSIX (alias del comando test) suscettibile a word splitting, mentre [[ è una keyword Bash nativa che supporta pattern matching, regex con =~ e gestione sicura degli spazi.

Q: Come gestisci la pulizia di file temporanei se lo script riceve un'interruzione?R: Registro una funzione di cleanup tramite il comando trap cleanup EXIT SIGINT SIGTERM, assicurando l'esecuzione della pulizia indipendentemente dal punto di uscita.

Insidie e errori comuni

Dimenticare i doppi apici attorno alle variabili esposte a word splitting e globbing ("$var").

Spazi accidentali nell'assegnazione delle variabili, ad esempio VAR = value genera errore di comando non trovato.

Uso scorretto di pipefail: in assenza di questo flag, una pipeline ritorna solo l'exit status dell'ultimo comando.

Modifica delle variabili dentro cicli in subshell, tipico quando si invia un flusso in pipe ad un while read.

Parsing diretto dell'output di ls invece di usare il globbing nativo (for file in *.txt).

Snippet e comandi

#!/usr/bin/env bash
set -euo pipefail

# Directory dello script corrente
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# Cleanup automatico all'uscita
TEMP_FILE="$(mktemp)"
cleanup() {
  rm -f "${TEMP_FILE}"
}
trap cleanup EXIT INT TERM

# Parsing argomenti con flag
while getopts ":f:v" opt; do
  case "${opt}" in
    f) FILE_PATH="${OPTARG}" ;;
    v) VERBOSE=true ;;
    *) echo "Uso: $0 [-f file] [-v]" >&2; exit 1 ;;
  esac
done

# Lettura file riga per riga
while IFS= read -r line || [[ -n "${line}" ]]; do
  printf '%s\n' "${line}"
done < "${FILE_PATH:-/dev/stdin}"

Da ripassare

[ ] Manipolazione stringhe con parameter expansion (${var#prefix}, ${var%suffix})

[ ] Differenza tra $* e $@ con e senza doppi apici

[ ] Gestione dei descrittori di file personalizzati (exec 3>&1)

[x] Sintassi e utilizzo di getopts

[x] Redirezione avanzata di stdout e stderr

Jarvis Interviews
Jarvis