🔁 Lezione 15: Cicli for, while, until in BASH

⏱️ Tempo stimato di lettura: 25 minuti
🧩 Difficoltà: Intermedio
🎯 Obiettivi specifici:

  • Comprendere la sintassi, le differenze e l’utilizzo dei cicli for, while e until in BASH.
  • Saper scegliere il ciclo più adatto a seconda del contesto.
  • Apprendere le best practices per evitare errori comuni nei cicli.
  • Scrivere script robusti che utilizzano cicli per automatizzare attività ripetitive.
  • Usare break, continue e cicli annidati per scenari complessi.
  • Applicare i cicli a casi d’uso reali in contesti professionali.

📖 Teoria: i cicli in BASH

La frase chiave di questa lezione è “cicli for, while e until in BASH”.

In ambito informatico, il concetto di ciclo (o loop) è centrale per la strutturazione del controllo di flusso. In particolare, nei linguaggi di scripting come BASH, i cicli sono strumenti indispensabili per automatizzare sequenze ripetitive di comandi, specialmente in contesti sistemistici e di gestione dei dati. Comprendere a fondo le dinamiche dei cicli for, while e until non è soltanto una questione pratica, ma anche un esercizio di logica computazionale.

🔁 Il ciclo for

Il costrutto for in BASH consente di iterare su una sequenza finita di elementi. La sua forma più canonica si presenta come segue:

for variabile in elemento1 elemento2 ... elementoN
  do
    # corpo del ciclo
  done

Ad ogni iterazione, la variabile assume il valore corrente della sequenza. Questo paradigma è ideale quando il dominio dell’iterazione è noto a priori. Può essere un insieme discreto di stringhe, numeri o anche l’espansione di una glob pattern (es. *.txt).

È disponibile anche una sintassi alternativa, di ispirazione C-like:

for ((espressione_iniziale; condizione; incremento))
  do
    # corpo del ciclo
  done

Questa variante permette una maggiore flessibilità aritmetica ed è particolarmente indicata nei casi in cui si voglia controllare direttamente l’indice dell’iterazione. Inoltre, il ciclo for può essere applicato su output dinamici generati da comandi:

for file in $(ls *.txt); do
  echo "Elaborazione di $file"
done

⚠️ Attenzione: quando si gestiscono nomi di file con spazi o caratteri speciali, è preferibile usare while read.

🔄 Il ciclo while

Il ciclo while rappresenta un costrutto iterativo condizionato: la sua esecuzione prosegue finché una condizione booleana rimane verificata. È utile quando la ripetizione dipende da un cambiamento dinamico dello stato del sistema, non prevedibile a priori.

while [ condizione ]
  do
    # corpo del ciclo
  done

Esempio:

count=1
while [ $count -le 5 ]; do
  echo "$count"
  ((count++))
done

🔁 Il ciclo until

Complementare a while, il ciclo until esegue il proprio corpo fintanto che la condizione è falsa. In termini logici, until è l’equivalente del while con la negazione della condizione:

until [ condizione ]
  do
    # corpo del ciclo
  done

Esempio:

until ping -c1 192.168.1.1 &>/dev/null; do
  echo "In attesa di rete..."
  sleep 2
done

🔂 Cicli annidati e controllo del flusso

L’utilizzo di cicli annidati è essenziale per modellare scenari multidimensionali o per gestire interazioni tra più insiemi.

for x in A B; do
  for y in 1 2 3; do
    echo "$x$y"
  done
done

L’uso combinato di break e continue permette di gestire in modo fine il controllo del flusso:

  • break interrompe immediatamente il ciclo corrente.
  • continue salta al prossimo ciclo, evitando l’esecuzione del codice rimanente.
for i in {1..10}; do
  if (( i % 2 == 0 )); then continue; fi
  echo "Dispari: $i"
done

💡 Considerazioni formali e best practices

Dal punto di vista della progettazione di uno script robusto:

  • Ogni ciclo dovrebbe essere pensato come una funzione con un invariante ben definito.
  • Le condizioni di terminazione devono essere sempre esplicite e verificabili.
  • È buona norma evitare l’uso eccessivo di break se questo compromette la leggibilità del flusso.
  • Evita di iterare su output non quotati (for i in $(cat file)), preferisci while read.

Inoltre, è fondamentale comprendere il contesto operativo dello script: iterazioni su grandi insiemi di file, esecuzione remota, controllo di flussi di dati binari, ecc., richiedono attenzioni particolari (es. uso di find, lettura protetta di input con IFS, redirezione sicura degli output).

📊 Tabella di sintesi

CicloProsegue finché…Tipico usoVantaggi
forelementi da iteraresequenze, liste, arraysemplice, leggibile
whilecondizione è verainput, attesa di statocontrollo reattivo
untilcondizione è falsaattesa eventosemantica inversa, leggibile


🔶 Esempi pratici

📁 Iterazione su file .txt

for file in *.txt; do
  echo "Trovato file: $file"
done

🧮 Ciclo numerico con step personalizzato

for ((i=0; i<=20; i+=5)); do
  echo "Valore: $i"
done

🔄 while con condizione dinamica

x=5
while [ $x -gt 0 ]; do
  echo "Countdown: $x"
  ((x--))
done

❗ until in attesa di una connessione

until ping -c1 google.com &> /dev/null; do
  echo "Connessione assente. Riprovo..."
  sleep 3
done

🔁 Cicli annidati su directory e file

for dir in */; do
  for file in "$dir"*.sh; do
    echo "Script trovato: $file"
  done
done

📝 Esercizio finale

Scrivi uno script che:

  1. Chiede all’utente quanti file creare
  2. Usa un for per crearli (file1.txt, file2.txt…)
  3. Con while, verifica che i file siano stati creati
  4. Con until, aspetta che l’utente cancelli un file

✅ Bonus

Aggiungi un controllo: se l’utente inserisce un numero negativo o non numerico, lo script deve chiederlo di nuovo.


🧠 Quiz finale a scelta multipla

  1. Quale ciclo è più adatto per iterare su elementi noti?
    • A) until
    • B) while
    • C) for ✅
  2. Cosa fa ((i+=2))?
    • A) Incrementa di 1
    • B) Incrementa di 2 ✅
    • C) Diminuisce di 2
  3. Quando termina un ciclo until?
    • A) Quando la condizione è falsa
    • B) Quando la condizione è vera ✅
    • C) Quando termina il file
  4. Che output produce questo script?
for i in {1..3}; do echo $i; done
  • A) Stampa 1 2 3 ✅
  • B) Errore di sintassi
  • C) Nessun output
  1. Come si interrompe un ciclo in modo anticipato?
    • A) exit
    • B) stop
    • C) break ✅

📚 Glossario tecnico

  • Loop: Sinonimo di ciclo.
  • break: Comando per uscire da un ciclo.
  • continue: Salta alla prossima iterazione.
  • IFS: Internal Field Separator, utile per leggere file riga per riga.
  • Espansione di sequenza: {1..5} genera i numeri da 1 a 5.
  • Condizione booleana: Espressione che restituisce vero o falso.

❓ FAQ

  1. Posso combinare più cicli nello stesso script?
    Sì, puoi usare for, while, until e anche annidarli.
  2. Meglio for o while per leggere file?
    Se si vuole garantire compatibilità e gestire spazi, meglio while read.
  3. È possibile creare cicli infiniti?
    Sì, con while true; do ... done o for ((;;)), ma vanno controllati.
  4. Come posso leggere input utente all’interno di un ciclo?
    Usa read all’interno del corpo del ciclo.
  5. Che differenza c’è tra [ ] e [[ ]]?
    [[ ]] è più moderno e gestisce meglio gli operatori logici e pattern.


🔗 Link : Guida completa ai comandi BASH
🔗 Link : GNU Bash Reference Manual – Loops

🔷 Lezione 15/24 completata
📢 Hai dubbi? Scrivici nei commenti o consulta le lezioni correlate.


📩 Vuoi il PDF della lezione? Scrivici!
🗨️ Hai domande? Commenta qui sotto!

Lascia un commento