
I loop sono uno dei concetti fondamentali dei linguaggi di programmazione. I loop sono utili quando vuoi eseguire una serie di comandi più e più volte fino al raggiungimento di una determinata condizione.
Nei linguaggi di scripting come Bash, i loop sono utili per automatizzare attività ripetitive.
Ci sono tre costrutti di ciclo di base nello scripting Bash, for
ciclo, while
ciclo e until
ciclo.
In questo tutorial, tratteremo le basi dei loop for in Bash. Ti mostreremo anche come utilizzare il break
e continue
istruzioni per alterare il flusso di un ciclo.
Il Bash standard for
Ciclo #
Il for
loop scorre un elenco di elementi ed esegue il set di comandi specificato.
Il bash for
loop assume 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.
Cicla sulle stringhe #
Nell'esempio seguente, il ciclo scorrerà su ogni elemento nell'elenco di stringhe e sulla variabile element
verrà impostato sull'elemento corrente:
for element in Hydrogen Helium Lithium Beryllium
do
echo "Element: $element"
done
Il ciclo produrrà il seguente output:
Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium
Cicla su un intervallo di numeri #
È possibile utilizzare l'espressione della sequenza per specificare un intervallo di numeri o caratteri definendo un punto iniziale e finale dell'intervallo. L'espressione della sequenza assume la forma seguente:
{START..END}
Ecco un esempio di ciclo che scorre 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}
Ecco un esempio che mostra come aumentare di 5:
for i in {0..20..5}
do
echo "Number: $i"
done
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20
Cicla sugli elementi dell'array #
Puoi anche usare il for
ciclo per scorrere un array di elementi.
Nell'esempio seguente, stiamo definendo un array chiamato BOOKS
e iterando su 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
Il ciclo Bash for in stile C #
La sintassi dello stile C for
loop sta assumendo la forma seguente:
for ((INITIALIZATION; TEST; STEP))
do
[COMMANDS]
done
L'INITIALIZATION
parte viene eseguita solo una volta all'inizio del ciclo. Quindi, il TEST
parte viene valutata. Se è false, il ciclo viene terminato. Se il TEST
è vero, comandi all'interno del corpo di for
loop vengono eseguiti e il STEP
parte è aggiornata.
Nel codice di esempio seguente, il ciclo inizia inizializzando i = 0
, e prima di ogni iterazione controlla se i ≤ 10
. Se true stampa il valore corrente di i
e [incrementa la variabile] i
per 1 (i++
) altrimenti il ciclo termina.
for ((i = 0 ; i <= 1000 ; i++)); do
echo "Counter: $i"
done
Il ciclo eseguirà 1001 iterazioni e produrrà il seguente output:
Counter: 0
Counter: 1
Counter: 2
...
Counter: 998
Counter: 999
Counter: 1000
break
e continue
Dichiarazioni #
La break
e continue
Le istruzioni possono essere utilizzate per controllare l'esecuzione del ciclo for.
break
Dichiarazione #
La 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 ciclo quando viene soddisfatta una determinata condizione.
Nell'esempio seguente, stiamo usando if
istruzione per terminare l'esecuzione del ciclo una volta che l'elemento correntemente iterato è uguale a "Lithium".
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!
continue
Dichiarazione #
Il continue
esce dall'iterazione corrente di un ciclo e passa il controllo del programma all'iterazione successiva del ciclo.
Nell'esempio seguente, stiamo scorrendo un intervallo di numeri. Quando l'elemento correntemente ripetuto è uguale a "2", il continue
istruzione farà tornare l'esecuzione all'inizio del ciclo e per continuare 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
Bash for
Esempi di loop #
Rinominare i file con spazi nel nome file #
L'esempio seguente mostra come rinominare tutti i file nella directory corrente con uno spazio nei suoi nomi sostituendo lo spazio per sottolineare:
for file in *\ *; do
mv "$file" "${file// /_}"
done
Analizziamo il codice riga per riga:
- La prima riga crea un
for
loop e scorre un elenco di tutti i file con uno spazio nel 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// /_}
sta usando l'espansione del parametro della shell per sostituire un pattern all'interno di un parametro con una stringa. done
indica la fine del segmento del ciclo.
Cambiare l'estensione del file #
L'esempio seguente mostra come usare Bash for
loop 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
for
scorre 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 del file usando l'espansione dei parametri della shell done
indica la fine del segmento del ciclo.
Conclusione #
Il bash for
loop viene utilizzato per eseguire un determinato insieme di comandi ripetutamente per un numero fisso di volte.
Se hai domande o feedback, sentiti libero di lasciare un commento.