GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Scripting – For Loop spiegato con esempi

Nello scripting della shell Bash, i loop sono utili per automatizzare le attività ripetitive. Quando devi ripetere un'attività N numero di volte nel tuo script, è necessario utilizzare i loop. Ci sono tre tipi di loop supportati in bash.

  1. Ciclo per
  2. Durante il ciclo
  3. Fino al ciclo

Tutti e tre i cicli hanno lo stesso scopo di ripetere l'attività N numero di volte quando una condizione è soddisfatta, ma con differenze nel modo in cui sono definiti e utilizzati per ottenere il risultato.

Questo articolo si concentrerà sul "ciclo for" negli script Bash. Impareremo gli altri due loop nella nostra prossima guida.

Per la sintassi del ciclo

Comprendere la sintassi è molto importante prima di scrivere il tuo primo for loop .

for NAME in [ LIST OF ITEMS ]
do
  Command 1
  Command 2
  .....
  Command N
done 

Analizziamolo e vediamo cosa fa.

  • Inizia con la parola chiave "for" seguito da un nome di variabile.
  • La parola chiave "in" ottenere l'elenco degli elementi e memorizzarlo nella variabile per ogni iterazione.
  • La parola chiave "do" e "done" segna l'inizio e la fine del blocco del ciclo e il comando deve essere scritto all'interno di do and done.
  • Non ci sono regole rigide per il rientro, ma per una migliore leggibilità usa 2 spazi o scheda(4) . Sii coerente nell'utilizzo di spazi o tabulazioni in tutto lo script.

Puoi anche creare una singola riga per i loop. Crea un for loop nel terminale e premi il tasto freccia su e vedrai bash lo converte automaticamente in un loop a linea singola.

for NAME in [ LIST OF ITEMS]; do COMMANDS ; done

Esempio 1 - Utilizzo dell'elenco di elementi

Iniziamo con un semplice esempio.

Dalla sezione precedente, potresti aver capito che il for loop accetta un elenco di elementi. L'elenco di elementi può essere qualsiasi cosa come stringhe, array, numeri interi, intervalli, output di comandi, ecc.

Apri il terminale ed esegui il seguente pezzo di codice.

N=1
for val in Welcome To Ostechnix
do
 echo "Iteration $N → $val"
 ((++N))
done

Analizziamolo.

  • "Welcome to Ostechnix" è l'elenco degli elementi passati al for loop e ogni parola verrà selezionata come un'iterazione separata e memorizzata in una variabile (val ).
  • La variabile può essere chiamata qualsiasi cosa. Qui lo chiamo val .
  • Ci sono tre elementi nell'elenco, quindi ci saranno tre iterazioni nel for loop e ogni volta il valore della variabile val viene stampato.
  • Il comando ((++N )) fungerà da contatore e incrementerà il valore della variabile N quindi può essere stampato in echo dichiarazione.

Ora, dopo aver eseguito il precedente for loop comando premi il tasto freccia su dal terminale e puoi vedere il for loop multiriga viene convertito in una singola riga per un ciclo.

Esempio 2 - Utilizzo degli intervalli

Potresti voler eseguire il for loop N numero di volte, per questo, puoi usare il generatore di sequenze integrato in bash "{x..y[..incr]}" che genererà una sequenza di numeri.

  • X =Valore intero iniziale
  • Y =Valore intero finale
  • Incr =valore Intero opzionale che incrementa gli interi

Supponiamo che tu voglia eseguire il ciclo cinque volte, quindi puoi utilizzare il seguente snippet.

for rng in {1..5}
do
 echo "Value is == $rng"
done

Puoi anche utilizzare il parametro di incremento opzionale che eseguirà incrementi graduali.

Dai un'occhiata allo snippet di seguito in cui viene fornito l'incremento di tre. Questo genererà la sequenza da uno e farà un incremento di tre fino al valore finale dieci.

for rng1 in {1..10..3}
do
 echo "Value is == $rng1"
done

Esempio 3 - Esecuzione di comandi

Puoi eseguire qualsiasi comando che derivi un elenco di elementi che devono essere elaborati da for loop . Il comando dovrebbe essere racchiuso tra i segni di spunta "`` " o parentesi "$() ".

Nell'esempio seguente, sto eseguendo il comando che otterrà l'ID del processo e filtrerà gli ultimi cinque processi. Il ciclo For ora scorrerà attraverso ogni ID processo.

for list in $(ps -ef | awk {' print $2 '} | tail -n 5)
do 
  echo $list
done

Esempio 4 - Ripeti gli elementi dell'array

In scenari in tempo reale, memorizzerai alcuni valori in array e proverai a scorrere l'array per un'ulteriore elaborazione.

Prima di capire come scorrere un array, devi comprendere il comportamento di due variabili speciali ( [email protected] e $* ). Entrambe queste sono variabili speciali che vengono utilizzate per accedere a tutti gli elementi da un array.

Esegui il seguente pezzo di codice nel terminale. Una matrice X viene creato e quando provo a stampare tutti i valori ($X ) come come stampo le variabili, restituisce solo il primo valore dall'array.

$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16

Per accedere a tutti gli elementi di un array, devi utilizzare [email protected] o $* . La sintassi per l'accesso ai valori dell'array sarà la seguente.

$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week

Ora usalo con for loop per scorrere i valori dell'array.

X=( 16 09 2021 "Thursday Third Week" )

for items in ${X[@]}
do
 echo $items
done

Dai un'occhiata all'output sopra. Questo output sembra essere errato, perché la stringa (giovedì terza settimana) all'interno dell'array dovrebbe essere considerata come un valore singolo. Ma qui ogni elemento viene trattato come un elemento separato.

Questo è il comportamento predefinito quando utilizzi [email protected] o $ . Per ovviare a questo problema, racchiudere la variabile di espansione dell'array ([email protected] o $ ) tra virgolette.

for items in "${X[@]}"
do
 echo $items
done

Quando utilizzi le virgolette doppie, [email protected] e $* comportarsi diversamente. Mentre [email protected] espande l'array a ogni elemento in un array come mostrato nell'esempio sopra, $* espanderà l'intera matrice come un valore.

for items in "${X[*]}"
do
 echo $items
done

Avviso: Entrambi [email protected] e $* comportarsi in modo identico a meno che non sia racchiuso tra virgolette . Cerca di evitare $* a meno che non sia necessario.

Esempio 5 - Stile C per la sintassi dei loop

Bash offre anche c stile for loop sintassi. Se provengono da una C background linguistico, questa sintassi non sarà nuova per te.

Invece di scorrere un elenco, valuterai una condizione e, se la condizione è vera, verranno eseguiti i comandi all'interno del ciclo.

Ci sono tre parametri che devi comprendere in questa sintassi.

  • Variabile - Una variabile viene inizializzata solo una volta quando viene attivato il ciclo.
  • Condizione - La condizione deve essere vera per l'esecuzione del ciclo, altrimenti il ​​ciclo non verrà eseguito.
  • Contatore - Questo aumenterà il valore della variabile.

Ciascun parametro deve essere separato da un punto e virgola (; ) e deve essere racchiuso tra parentesi doppie come mostrato di seguito.

for (( variable; condition; counter ))
do
  Command 1 
  Command 2
  Command N 
done

Dai un'occhiata al seguente esempio di anno bisestile.

  • La variabile YEAR=2010 verrà prima inizializzato.
  • La condizione YEAR<=20 verrà valutato e se è vero il codice tra do e il done il blocco verrà eseguito.
  • Il contatore YEAR++ incrementerà l'anno di un conteggio. Fino alla variabile YEAR viene incrementato a 2020 , il ciclo si ripeterà.
  • Entro do e done blocco, viene scritta una dichiarazione condizionale per verificare se l'anno è bisestile o meno.
for ((YEAR=2010; YEAR<=2020; YEAR++))
do
 if [[ $(expr $YEAR % 4) -eq 0 ]]
 then
   echo "$YEAR =  leap year"
 else
   echo "$YEAR =  not a leap year"
 fi
done

Esempio 6 - Interrompere, Continuare l'utilizzo dell'istruzione

Esistono due parole chiave integrate in bash che vengono utilizzate per controllare il flusso dei tuoi loop.

  • Pausa - Esce dal ciclo e salta tutte le iterazioni in sospeso.
  • Continua - Salta l'iterazione corrente e ripassa il controllo al ciclo for per eseguire l'iterazione successiva.

Per verificare se sono incorporati in bash o meno, usa type comando:

$ type break continue
break is a shell builtin
continue is a shell builtin

Vediamo in breve come e dove possono essere utilizzati sia break che to continue.

Sto usando lo stesso codice che ho usato nella sezione precedente per trovare l'anno bisestile. In questo caso, ho solo bisogno di quello che sarà il primo anno bisestile tra il 2010 e il 2020. Se viene trovato quell'anno, il mio ciclo può uscire.

for ((YEAR=2010; YEAR<=2020; YEAR++))
do
 if [[ $(expr $YEAR % 4) -eq 0 ]]
 then
   echo "$YEAR =  leap year"
   break
 else
   echo "$YEAR =  not a leap year"
 fi
done

Dall'output sopra, puoi vedere for loop itera e quando viene trovato il primo anno bisestile 2012, break viene letta l'istruzione e il ciclo viene chiuso e il controllo viene restituito al terminale.

Ora sto modificando lo stesso codice per "continue" dichiarazione. Il continue quando viene interpretata, salterà l'iterazione corrente, ad esempio qualsiasi codice che viene dopo l'istruzione continue e passerà il controllo a for loop per eseguire l'iterazione successiva.

for ((YEAR=2010; YEAR<=2020; YEAR++))
do
 if [[ $(expr $YEAR % 4) -eq 0 ]]
 then
   echo "$YEAR =  leap year"
 else
   continue
   echo "$YEAR =  not a leap year"
 fi
done

Dall'immagine sopra, puoi vedere che c'è un'istruzione echo che viene saltata dall'istruzione continue.

Esempio 7 - Utilizzo dell'istruzione vera

Quando crei loop o istruzioni condizionali, non puoi lasciare vuoto il blocco di codice. Bash genererà un errore di sintassi.

Dai un'occhiata a entrambe le immagini sopra. Nella prima immagine, ho creato un for loop ma nessun comando tra do e done . Allo stesso modo nella seconda immagine, ho lasciato vuota la clausola else. In entrambi i casi, bash non accetta blocchi vuoti e genera errori di sintassi.

Puoi usare bash integrato “true" parola chiave che imposterà sempre il codice di uscita su 0 (successo).

$ type true
true is a shell builtin

In questo modo, stai lasciando il blocco di codice vuoto senza che bash generi errori.

Conclusione

In questa guida Bash for loop, abbiamo iniziato con l'introduzione ai loop e alla sintassi di for loop insieme allo stile C. Abbiamo anche visto come utilizzare i cicli for in condizioni diverse insieme alle istruzioni di controllo del ciclo break and continue. Consulta la nostra prossima guida per conoscere Bash While e Until loop con esempi.

  • Scripting di Bash:spiegazione del ciclo While e Until con esempi

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
  • Il reindirizzamento di Bash spiegato con esempi
  • Differenza tra la definizione di variabili Bash con e senza esportazione

Linux
  1. Bash For Loop Guida ed esempi

  2. Bash For Loop

  3. Esempi di Bash For Loop e While Loop

  4. 12 Esempi di Bash For Loop per gli script della tua shell Linux

  5. Esempi di Bash for loop

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

Il ciclo Bash FOR spiegato e semplificato

Script Bash per Loop spiegato con esempi