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.
- Ciclo per
- Durante il ciclo
- 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 alfor 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 variabileval
viene stampato. - Il comando ((
++N
)) fungerà da contatore e incrementerà il valore della variabileN
quindi può essere stampato inecho
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 inizialeY
=Valore intero finaleIncr
=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 trado
e ildone
il blocco verrà eseguito. - Il contatore
YEAR++
incrementerà l'anno di un conteggio. Fino alla variabileYEAR
viene incrementato a2020
, il ciclo si ripeterà. - Entro
do
edone
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