Introduzione
I loop sono uno dei concetti fondamentali dei linguaggi di programmazione. I loop sono utili quando si desidera eseguire ripetutamente una serie di comandi fino al raggiungimento di una determinata condizione.
In linguaggi di scripting come Bash, i loop sono utili per automatizzare attività ripetitive.
Esistono tre costrutti di loop di base negli script Bash, for loop, while loop e until a loop .
In questo tutorial, tratteremo le basi di for loop in Bash. Ti mostreremo anche come utilizzare le istruzioni break e continue per modificare il flusso di un ciclo.
Sintassi
Il ciclo for loop scorre un elenco di elementi ed esegue il set di comandi specificato.
Il ciclo di Bash for ha la forma seguente:
for item in [LIST]
do
[COMMANDS]
done
L'elenco può essere una serie di stringhe separate da spazi, un intervallo di numeri, l'output di un comando, un array e così via.
Passare attraverso le stringhe
Nell'esempio seguente il ciclo ripeterà ogni elemento nell'elenco di stringhe e la variabile element
verrà impostata sull'elemento corrente.
for element in Hydrogen Helium Lithium Beryllium
do
echo "Element: $element"
done
Il loop produrrà il seguente output:
Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium
Scorri su un intervallo di numeri
È possibile utilizzare l'espressione della sequenza per specificare un intervallo di numeri o caratteri definendo un inizio e il punto finale dell'intervallo. L'espressione assume la forma seguente:
{START..END}
Nell'esempio seguente il ciclo ripeterà tutti i numeri da 0 a 3.
for i in {0..3}
do
echo "Number: $i"
done
Number: 0
Number: 1
Number: 2
Number: 3
A partire da Bash 4, è anche possibile specificare un incremento quando si utilizzano gli intervalli. L'espressione assume la forma seguente:
{START..END..INCREMENT}
for i in {0..20..5}
do
echo "Number: $i"
done
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20
Passare attraverso gli elementi dell'array
Puoi anche usare il ciclo for per scorrere su una matrice di elementi:
Nell'esempio seguente, stiamo definendo un array BOOKS
e ripetendo ogni elemento dell'array.
BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')
for book in "${BOOKS[@]}"; do
echo "Book: $book"
done
Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: The Great Gatsby
Bash for Loop C-Style
La sintassi dello stile C assume la forma seguente:
for ((INITIALIZATION; TEST; STEP))
do
[COMMANDS]
done
La parte INITIALIZATION
viene eseguita una sola volta all'avvio del loop. Quindi, la parte TEST
viene valutata. Se è falso, il ciclo for è terminato. Se il valore TEST
è true, i comandi all'interno del corpo del ciclo for vengono eseguiti e la parte STEP
viene aggiornata.
Nel codice seguente, il ciclo inizia inizializzando i = 0
, quindi prima di ogni iterazione verifica se i ≤ 10
. Se vero, stampa il valore corrente di i
e [incrementa la variabile] i
di 1 ( i++
), altrimenti il ciclo termina.
for ((i = 0 ; i <= 1000 ; i++)); do
echo "Counter: $i"
done
Il ciclo ripeterà 1001 volte e produrrà il seguente output:
Counter: 0
Counter: 1
Counter: 2
...
Counter: 998
Counter: 999
Counter: 1000
Dichiarazioni di break and continue
Le istruzioni break e continue possono essere utilizzate per controllare l'esecuzione del ciclo for.
Dichiarazione di break (rottura)
L'istruzione break termina il ciclo corrente e passa il controllo del programma all'istruzione che segue l'istruzione terminata. Di solito viene utilizzato per terminare il loop quando viene soddisfatta una determinata condizione.
Nel seguente esempio, stiamo usando l'istruzione if per terminare l'esecuzione del ciclo una volta che l'elemento iterato corrente è uguale a "Litio".
for element in Hydrogen Helium Lithium Beryllium; do
if [[ "$element" == 'Lithium' ]]; then
break
fi
echo "Element: $element"
done
echo 'All Done!'
Element: Hydrogen
Element: Helium
All Done!
Dichiarazione Continua
L'istruzione continue esce dall'iterazione corrente di un ciclo e passa il controllo del programma alla successiva iterazione del ciclo.
Nel seguente esempio, stiamo iterando attraverso un intervallo di numeri e quando l'elemento iterato corrente è uguale a '2', l'istruzione continue farà tornare l'esecuzione all'inizio del ciclo e continuerà con l'iterazione successiva.
for i in {1..5}; do
if [[ "$i" == '2' ]]; then
continue
fi
echo "Number: $i"
done
Number: 1
Number: 3
Number: 4
Number: 5
Esempi di Bash for Loop
L'esempio seguente mostra come utilizzare il ciclo Bash for per rinominare tutti i file nella directory corrente con uno spazio nei nomi sostituendo lo spazio per il carattere di sottolineatura.
for file in *\ *; do
mv "$file" "${file// /_}"
done
Analizziamo il codice riga per riga:
- La prima riga crea un ciclo for e scorre un elenco di tutti i file con uno spazio nel suo nome. L'espressione
*\ *
crea l'elenco. - La seconda riga si applica a ciascun elemento dell'elenco e sposta il file in uno nuovo sostituendo lo spazio con un trattino basso
_
. La parte${file// /_}
utilizza l' espansione dei parametri della shell per sostituire un modello all'interno di un parametro con una stringa. done
indica la fine del segmento di loop.
Modificare l'estensione del file
L'esempio seguente mostra come utilizzare il ciclo Bash for per rinominare tutti i file che terminano con .jpeg nella directory corrente sostituendo l'estensione del file da .jpeg a .jpg.
for file in *.jpeg; do
mv -- "$file" "${file%.jpeg}.jpg"
done
Analizziamo il codice riga per riga:
- La prima riga crea un ciclo for e scorre un elenco di tutti i file che terminano con '.jpeg'.
- La seconda riga si applica a ciascun elemento dell'elenco e sposta il file in uno nuovo sostituendo ".jpeg" con ".jpg".
${file%.jpeg}
per rimuovere la parte '.jpeg' dal nome file usando l' Shell Parameter Expansion done
indica la fine del segmento di loop.
Conclusione
Ormai dovresti avere una buona conoscenza di come usare bash for loop per scorrere gli elenchi.