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.
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.
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:
Vediamo ora alcuni esempi pratici basati sul ciclo for in stile POSIX:
#!/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.
#!/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:
fruits=("Apple" "Banana" "Orange" "Grapes")
viene utilizzato per dichiarare l’array contenente quattro nomi di frutti diversi.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.echo "Fruit: $fruit"
” stampa il nome di ciascun frutto su una nuova riga insieme alla parola “Frutto” durante ogni iterazione.Ecco l’output che otterremo dai comandi precedenti:
#!/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:
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.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.L’output per il ciclo for con sostituzione del comando, come dimostrato nell’esempio precedente, sarebbe:
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.Vediamo ora alcuni esempi pratici basati sul ciclo for in stile C:
!#/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:
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.Ecco l’output che otterrai per il codice sopra:
#!/bin/bash
fruits=("Apple" "Banana" "Orange" "Grapes")
for ((i = 0; i < ${#fruits(@)}; i++)); do
echo "Fruit $((i+1)): ${fruits(i)}"
done
Nel codice sopra:
Ecco l’output del ciclo for riportato sopra: