Introduzione

I loop sono uno dei concetti fondamentali dei linguaggi di programmazione. I loop sono utili quando si desidera eseguire una serie di comandi un numero di volte fino a quando non viene soddisfatta una determinata condizione.

In linguaggi di scripting come Bash, i loop sono utili per automatizzare attività ripetitive. Esistono 3 costrutti di loop di base negli script Bash, for loop , while loop e until a loop .

Questo tutorial spiega le basi di loop while in Bash e le istruzioni break e continue per modificare il flusso di un loop.

Bash While Loop

Il ciclo while viene utilizzato per eseguire un determinato set di comandi un numero sconosciuto di volte, purché la condizione specificata sia vera.

Il ciclo Bash while ha la forma seguente:

while [CONDITION]
do
  [COMMANDS]
done

La condizione viene valutata prima di eseguire i comandi. Se la condizione restituisce true, i comandi vengono eseguiti. In caso contrario, se la condizione restituisce false, il ciclo verrà terminato e il controllo del programma verrà passato al comando seguente.

Nell'esempio seguente, ad ogni iterazione il ciclo stampa il valore corrente della variabile i e incrementa la variabile di uno.

i=0

while [ $i -le 2 ]
do
  echo Number: $i
  ((i++))
done

Il ciclo di ripetizione continua finché i è inferiore o uguale a due. Produrrà il seguente output:

Number: 0
Number: 1
Number: 2

While Loop infinito

Un ciclo infinito è un ciclo che si ripete all'infinito e non termina mai. Se la condizione viene sempre valutata vera, si ottiene un ciclo infinito.

Nel seguente esempio stiamo usando il comando integrato : che restituisce sempre true per creare un ciclo infinito. È inoltre possibile utilizzare il comando true integrato o qualsiasi altra istruzione che restituisce sempre true.

while :
do
  echo "Press <CTRL+C> to exit."
  sleep 1
done

Il ciclo while sopra funzionerà indefinitamente. È possibile terminare il loop premendo CTRL+C.

Ecco un equivalente a riga singola:

while :; do echo 'Press <CTRL+C> to exit.'; sleep 1; done

Leggi un file riga per riga

Uno degli usi più comuni del ciclo while è leggere un file, un flusso di dati o una variabile riga per riga.

Nell'esempio seguente il ciclo while leggerà il file /etc/passwd riga per riga e stamperà ogni riga.

file=/etc/passwd

while read -r line; do
  echo $line
done < "$file"

Invece di controllare il ciclo while con una condizione, stiamo usando l'input redirection < "$file" per passare un file al read che è il comando che controlla il ciclo. Il ciclo while verrà eseguito fino alla lettura dell'ultima riga.

Quando si legge il file riga per riga, utilizzare sempre read con l'opzione -r per evitare che la barra rovesciata funga da carattere di escape.

Per impostazione predefinita, il comando read taglia i caratteri di spazi bianchi iniziali/finali (spazi e tabulazioni). Utilizzare l'opzione IFS= prima del comando read per impedire questo comportamento

file=/etc/passwd

while IFS= read -r line; do
  echo $line
done < "$file"

Dichiarazioni di break and continue

Le istruzioni break e continue possono essere utilizzate per controllare l'esecuzione del ciclo while.

Dichiarazione di rottura

L'istruzione break termina il loop corrente e passa il controllo del programma al comando che segue il loop terminato. Di solito viene utilizzato per terminare il loop quando viene soddisfatta una determinata condizione.

Nel seguente esempio, l'esecuzione del ciclo verrà interrotta quando l'elemento iterato corrente è uguale a 2.

i=0

while [ $i -lt 5 ]
do
  echo "Number: $i"
  ((i++))
  if [[ "$i" == '2' ]]; then
    break
  fi
done

echo 'All Done!'
Number: 0
Number: 1
All Done!

Dichiarazione Continue

L'istruzione continue esce dall'iterazione corrente di un ciclo e passa il controllo del programma alla successiva iterazione del ciclo.

Di seguito, una volta che l'elemento iterato corrente è uguale 2, la dichiarazione continue permetterà di tornare all'inizio del ciclo e continuerà con l'iterazione successiva.

i=0

while [ $i -lt 5 ]
do
  ((i++))
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Number: $i"
done

echo 'All Done!'
Number: 1
Number: 3
Number: 4
Number: 5
All Done!

Conclusione

Ormai dovresti avere una buona conoscenza di come usare il ciclo bash while.