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] idi 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.