⏱️ Tempo stimato di lettura: 25 minuti
🧩 Difficoltà: Intermedio
🎯 Obiettivi specifici:
- Comprendere la sintassi, le differenze e l’utilizzo dei cicli
for,whileeuntilin 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,continuee 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:
breakinterrompe immediatamente il ciclo corrente.continuesalta 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
breakse questo compromette la leggibilità del flusso. - Evita di iterare su output non quotati (
for i in $(cat file)), preferisciwhile 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
| Ciclo | Prosegue finché… | Tipico uso | Vantaggi |
|---|---|---|---|
for | elementi da iterare | sequenze, liste, array | semplice, leggibile |
while | condizione è vera | input, attesa di stato | controllo reattivo |
until | condizione è falsa | attesa evento | semantica 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:
- Chiede all’utente quanti file creare
- Usa un
forper crearli (file1.txt, file2.txt…) - Con
while, verifica che i file siano stati creati - 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
- Quale ciclo è più adatto per iterare su elementi noti?
- A) until
- B) while
- C) for ✅
- Cosa fa
((i+=2))?- A) Incrementa di 1
- B) Incrementa di 2 ✅
- C) Diminuisce di 2
- Quando termina un ciclo
until?- A) Quando la condizione è falsa
- B) Quando la condizione è vera ✅
- C) Quando termina il file
- 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
- 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
- Posso combinare più cicli nello stesso script?
Sì, puoi usarefor,while,untile anche annidarli. - Meglio
forowhileper leggere file?
Se si vuole garantire compatibilità e gestire spazi, megliowhile read. - È possibile creare cicli infiniti?
Sì, conwhile true; do ... doneofor ((;;)), ma vanno controllati. - Come posso leggere input utente all’interno di un ciclo?
Usareadall’interno del corpo del ciclo. - 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!
