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