Questo è un articolo di continuazione in bash loop in cui l'articolo precedente abbiamo spiegato su for loop . In questo articolo, daremo un'occhiata ad altri due bash loop, vale a dire, while
e until
ciclo continuo.
Il while
loop viene utilizzato principalmente quando devi leggere il contenuto del file ed elaborarlo ulteriormente. La lettura e la scrittura su un file sono operazioni comuni quando si scrivono script bash. Vedremo come leggere i file usando un while
ciclo.
Abbiamo già un articolo molto dettagliato su come scrivere su un file usando gli operatori di reindirizzamento.
- Il reindirizzamento di Bash spiegato con esempi
La funzionalità del while
loop è simile a for
ciclo continuo. Il for
loop scorre un elenco di elementi ed esegue il blocco di codice N un certo numero di volte. Qui nel while
loop, la condizione viene valutata per prima e, se la condizione è vera, il blocco di codice verrà eseguito finché la condizione non viene valutata come falsa.
1. Durante il ciclo
Di seguito è riportato il while
sintassi del ciclo. Il ciclo inizia con il "while" parola chiave seguita da una condizione che dovrebbe essere valutata come vera. Tra do
e done
il blocco è il punto in cui verranno inseriti i codici che verranno ripetuti N numero di volte.
while [[ condition ]] do Command 1 Command 2 .... Command 3 done
ESEMPIO 1 - Valuta e ripeti
Dai un'occhiata all'esempio qui sotto. Qui ho creato una variabile "NUM=5"
e la mia condizione ($NUM -ne 0
) è, il ciclo verrà eseguito se la variabile NUM
non è uguale a zero.
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM \n" ((--NUM)) done
Dovresti usare contatori per aumentare o diminuire i valori memorizzati nelle variabili quando si lavora con while
loop. In caso contrario, diventerà un ciclo infinito e NUM
sarà sempre impostato su cinque. Qui sto decrementando il valore di NUM
in ogni iterazione eseguendo ((--NUM))
, quindi quando la mia variabile NUM
è impostato a zero, l'uscita del ciclo.
((++NUM)) → Increment NUM variable by 1, similar to running NUM=$(( $NUM + 1 )) ((--NUM)) → Decrement NUM variable by 1, similar to running NUM=$(( $NUM - 1 ))
ESEMPIO 2 - Loop infiniti
Un ciclo infinito è dove la tua condizione viene sempre valutata come vera e il ciclo non uscirà mai.
Per creare loop infiniti, puoi usare true
incorporata in bash parola chiave. Inoltre, usa il "sleep"
comando durante il test di loop infiniti che ti daranno il controllo sull'arresto dello script, altrimenti lo schermo sarà inondato di output a scorrimento veloce.
$ NUM=0 while true do printf "Value of NUM = $NUM \n" ((++NUM)) sleep 2 done
ESEMPIO 3 - Separatore di campo interno (IFS)
IFS è una speciale variabile di shell che decide come vengono gestiti i limiti delle parole. Per impostazione predefinita, IFS è impostato su spazio, tabulazione e un carattere di nuova riga. Apri il terminale ed esegui i seguenti comandi:
$ var1="foo:bar foo bar"
$ for val in $var1 do echo $val done
Dai un'occhiata all'output. Il for
loop sta iterando su una stringa ed è IFS che decide i limiti delle parole e considera lo spazio come separatore di campo.
Ora esegui di nuovo il codice seguente. Qui IFS è impostato su due punti .
$ var1="foo:bar foo bar"
$ IFS=":"
$ for val in $var1 do echo $val done
Dall'output sopra, puoi vedere che i due punti del separatore di campo personalizzato vengono utilizzati come confine di parola. Puoi riportare l'IFS allo stato predefinito eseguendo unset
comando.
$ unset IFS
ESEMPIO 4 - Leggi il file usando il ciclo while
Il while
loop è consigliato quando si desidera leggere un file riga per riga ed elaborarlo.
Crea un nuovo file chiamato test.txt
utilizzando il seguente contenuto. C'è una riga vuota dopo la riga 2 per mostrare il comportamento di come vengono gestite le righe vuote.
14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
Useremo il read
comando che accetta l'input dal reindirizzamento e lo memorizza in una variabile insieme a un operatore di reindirizzamento dell'input in cui il nome del file verrà reindirizzato al while
ciclo continuo. Il read
Il comando utilizzerà l'IFS predefinito per impostare il limite di divisione delle parole.
$ while read line do echo $line done < test.txt
Nell'esempio sopra, test.txt
il file viene reindirizzato al while
loop e read
il comando legge riga per riga e lo memorizza nella variabile "line" e viene ulteriormente elaborato all'interno del ciclo. Le righe vuote non vengono saltate quando segui questo metodo e questo non è il comportamento che potresti desiderare. Quindi devi fare in modo esplicito le righe vuote da saltare.
Ci sono più opzioni per tagliare le righe vuote dal file di input. Puoi usare sed
, awk
e istruzioni condizionali, ecc. Preferisco usare entrambi awk
e sed
per ripulire le righe vuote prima di eseguirne il ciclo usando un while
ciclo.
# USING SED $ sed -i '/^[[:space:]]*$/d' test.txt 14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
# USING AWK $ awk 'NF' test.txt
Come visto negli esempi precedenti, puoi modificare IFS a seconda di come vuoi leggere il tuo file. Ad esempio, se stai gestendo un file CSV, il delimitatore può essere impostato su una virgola. Ho modificato lo stesso file di input in formato CSV.
14:00,Brighton,Leicester 14:00,West Ham,Man Utd 16:30,Spurs,Chelsea
Nell'esempio seguente, IFS è impostato su virgola (IFS=","
) e ogni campo sarà memorizzato in una variabile separata (tempo, squadra1, squadra2).
while IFS="," read time team1 team2 do echo "$team1 is playing against $team2 at $time" done < test.txt
ESEMPIO 5 - Controllo del flusso del loop con Break and Continue
Se hai letto il nostro articolo bash for loop, potresti sapere cos'è break e continua usato per. Sia break che continue sono parole chiave integrate in bash che ti aiuteranno a controllare il flusso del tuo ciclo.
La parola chiave "break" uscirà completamente dal ciclo e passerà il controllo al comando successivo nello script. Nell'esempio sottostante. Quando il NUM
è uguale a tre, il ciclo verrà chiuso dalla break
comando.
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM \n" if [[ $NUM -eq 3 ]] then break fi ((--NUM)) done
La parola chiave "continue" salterà l'iterazione corrente e restituirà il controllo al ciclo while e avvierà l'iterazione successiva.
$ NUM=0 while [[ $NUM -lt 5 ]] do ((++NUM)) if [[ $NUM -eq 3 ]] then continue fi printf "Value of NUM = $NUM \n" done
2. Fino al ciclo
Il until
loop è l'esatto opposto di while
ciclo continuo. Il while
loop valuta che la condizione sia vera per eseguire il blocco di codice e until
loop valuta la condizione come falsa per l'esecuzione del ciclo.
La sintassi è la stessa di while
loop ma al posto della parola chiave while
, until
verrà utilizzato.
until [[ condition ]] do Command 1 Command 2 .... Command 3 done
Dall'esempio seguente, puoi vedere until
loop valuta la variabile NUM
essere maggiore di uguale a cinque. È falso poiché NUM
è impostato su zero e verrà incrementato nelle iterazioni successive utilizzando ((++NUM))
. Quindi quando NUM
è uguale a cinque la condizione viene valutata come vera e until
il ciclo smetterà di essere eseguito.
$ NUM=0
$ until [[ $NUM -ge 5 ]] do echo $NUM ((++NUM)) done
Per creare loop infiniti, puoi utilizzare la parola chiave "false" .
$ NUM=0
$ until false do echo $NUM ((++NUM)) done
Per controllare il flusso del ciclo, puoi utilizzare break
e continue
parole chiave come quelle mostrate nel while
sezione loop sopra.
Conclusione
In questo articolo, abbiamo visto come usare while
ciclo e until
loop negli script bash. Until
loop è usato meno frequentemente rispetto a for
e while
loop ma questo serve per decidere il tuo script e quali tipi di loop sono richiesti. Sentiti a tuo agio nell'usare tutti e tre i loop.
Se hai domande o feedback, non esitare a farcelo sapere tramite la sezione commenti qui sotto.
Lettura correlata:
- Scripting Bash:funzioni spiegate con esempi
- Scripting Bash:variabili spiegate con esempi
- Comando Bash Echo spiegato con esempi in Linux
- Tutorial Bash Heredoc per principianti
- Come ripetere un comando finché non riesce in Linux
- Differenza tra la definizione di variabili Bash con e senza esportazione