GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Scripting - Mentre e fino a ciclo spiegato con esempi

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

Linux
  1. Bash For Loop Guida ed esempi

  2. Comandi Head and Tail in Linux spiegati con esempi

  3. Esempi di Bash For Loop e While Loop

  4. Tieniti aggiornato - Bash For, While, Until Esempi di loop

  5. Usando e in Bash mentre il ciclo

Scripting Bash – Spiegazione del comando Printf con esempi

Bash Scripting – Array associativo spiegato con esempi

Bash Scripting – Array indicizzato spiegato con esempi

Bash For Loops con esempi

Bash Scripting Part2 – Cicli For e While con esempi

Script Bash per Loop spiegato con esempi