5 esempi utili di Bash For Loop
Immagina di avere una directory piena di migliaia di file e che ti sia stato chiesto di elaborare questi file uno per uno. Sembra piuttosto noioso, vero? Beh no, se stai usando i cicli For nello script Bash. Il ciclo For nello script bash è uno strumento magico che può aiutarti ad automatizzare qualsiasi attività ripetitiva gestendo in modo efficiente tali file senza sudare troppo. In questo articolo parliamo di cosa sono i cicli for in bash con alcuni esempi pratici per rendere l’automazione un gioco da ragazzi.
Cos’è il ciclo For in Bash Script
Il ciclo For è una struttura di controllo utilizzata per eseguire attività ripetitive o eseguire una serie di comandi un numero specifico di volte. Con il ciclo for puoi scorrere numeri, elenchi, file o persino directory.
Bash For Loop: sintassi stile POSIX
La sintassi in stile POSIX (Portable Operating System Interface) può essere utilizzata con shell conformi a POSIX come bash e può essere utilizzata per scorrere un elenco di file, qualsiasi sequenza o persino l’output di altri comandi. Ecco la sintassi del ciclo for nello script bash:
for <loop_variable> in <list_to_iterate>
do
<Commands_to_be_executed_in_each_iteration>
done
Nella sintassi sopra, ecco cosa significa tutto:
è una variabile definita dall’utente che contiene ogni elemento da . si riferisce all’elenco di elementi su cui è necessario eseguire l’iterazione del ciclo for. Può essere un elenco di numeri, stringhe, output di un comando, ecc. - La parola chiave do indica l’inizio del ciclo for.
contiene i comandi o le istruzioni che verranno eseguiti per ogni iterazione. - La parola chiave done indica la fine del ciclo for.
Vediamo ora alcuni esempi pratici basati sul ciclo for in stile POSIX:
Esempio 1: ciclo attraverso un intervallo dato
#!/bin/bash
# Print numbers from 1 to 5
for i in $(seq 1 5); do
echo $i
done
Nello snippet sopra, la parte $(seq 1 5) viene utilizzata per generare un elenco di numeri interi da 1 a 5. Quindi eseguirà il loop dell’elenco uno per uno e ciascun valore verrà stampato su una nuova riga.
Esempio 2: ciclo attraverso un array
#!/bin/bash
fruits=("Apple" "Banana" "Orange" "Grapes")
for fruit in "${fruits(@)}"; do
echo "Fruit: $fruit"
done
Un array è una struttura dati utilizzata per contenere più dati di tipo diverso. Nello snippet sopra:
- La linea
fruits=("Apple" "Banana" "Orange" "Grapes")
viene utilizzato per dichiarare l’array contenente quattro nomi di frutti diversi. - La linea “
for fruit in "${fruits(@)}"; do
” imposta il ciclo For. Specifica la variabile “frutta” per contenere il valore dell’elemento corrente e “${fruits(@)}
” come array da iterare. IL “@
“, entro “${fruits(@)}
“, rappresenta tutti gli elementi dell’array. - La linea “
echo "Fruit: $fruit"
” stampa il nome di ciascun frutto su una nuova riga insieme alla parola “Frutto” durante ogni iterazione. - Infine l’ultima riga “done” indica la fine del ciclo for.
Ecco l’output che otterremo dai comandi precedenti:
Esempio 3: Ciclo con sostituzione di comando
#!/bin/bash
for file in $(ls); do
echo "File: $file"
done
Il modo in cui funziona la sostituzione dei comandi è che il comando viene prima eseguito e quindi il ciclo for ripeterà l’intero output del comando. Il comando su cui eseguire l’iterazione è inserito all’interno di “$()
“. Nello snippet sopra:
- Nella linea
for file in $(ls); do
IL$(ls)
parte esegue quindi il comando ‘ls’ e il suo output (l’elenco dei file nella directory corrente) viene utilizzato come input per il ciclo. Il ciclo ripeterà ciascun nome di file trovato nell’output. - La linea
echo "File: $file"
stampa il valore della variabile “file” insieme al prefisso “File: ” durante ogni iterazione. La variabile “file” contiene il nome del file corrente in fase di elaborazione nel ciclo. - Infine l’ultima riga “done” indica la fine del ciclo for.
L’output per il ciclo for con sostituzione del comando, come dimostrato nell’esempio precedente, sarebbe:
Bash For Loop: sintassi stile C
La sintassi in stile C è adatta agli utenti che sono più abituati alla sintassi del ciclo for in altri linguaggi come C, C++, Java, JavaScript, ecc. Ecco la sintassi di base del ciclo for in stile C:
for ((<variable_initialization>; <test_condition>; <step_value>))
do
<commands_to_execute>
done
Nella sintassi sopra:
<variable_initialization>
si riferisce al valore iniziale da cui inizierà la variabile del ciclo.<test_condition>
definisce la condizione da cui dipenderà l’output; questa condizione viene verificata ad ogni iterazione.<step_value>
si riferisce al valore in base al quale la variabile del ciclo deve essere aggiornata.si riferisce ai comandi o alle istruzioni che devono essere eseguiti per ogni iterazione.
Vediamo ora alcuni esempi pratici basati sul ciclo for in stile C:
Esempio 1: stampa i numeri dispari da 1 a 10
!#/bin/bash
for((i = 1; i <= 10; i = i + 1))
do
if (( i % 2 == 1 ))
then
echo "Odd Number: $i"
fi
done
Nello snippet sopra:
- La linea
for((i = 1; i <= 10; i = i + 1))
inizializza la variabile del ciclo su 1, controlla se il “valore di i è inferiore o uguale a 10” per ogni iterazione e infine incrementa il valore di i aggiungendo 1 al valore corrente dopo ogni iterazione. - if (( i % 2 == 1 )) controlla se il valore del resto dividendo il valore corrente di i con 2 è uguale a 1 o meno –
- se divisibile, allora la riga echo “Numero dispari: $i” viene eseguita stampando il valore di i.
- la linea fi indica la fine della condizione if.
- Infine, l’ultima riga delimita la fine del ciclo for e viene eseguita alla fine.
Ecco l’output che otterrai per il codice sopra:
Esempio 2: ciclo attraverso un array
#!/bin/bash
fruits=("Apple" "Banana" "Orange" "Grapes")
for ((i = 0; i < ${#fruits(@)}; i++)); do
echo "Fruit $((i+1)): ${fruits(i)}"
done
Nel codice sopra:
- frutta=(“Mela” “Banana” “Arancia” “Uva”) crea un array di tutti i nomi dei frutti.
- for ((i = 0; i < ${#frutti(@)}; i++)) inizializza innanzitutto la variabile del ciclo “i” su 0 che fungerà anche da variabile indice per l'array, e il ciclo continua finché “ i" è inferiore al numero di elementi nell'array "fruits" (indicato con ${#fruits()}). Il ciclo incrementa "i" di 1 in ogni iterazione.
- Poiché gli indici dell’array iniziano da 0 ma vogliamo visualizzarli a partire da 1, la riga echo “Fruit $((i+1)): ${fruits(i)}” stampa il valore che è uguale all’indice corrente “ i” più 1.
- Infine, l’ultima riga indica la fine del ciclo for
Ecco l’output del ciclo for riportato sopra: