GNU/Linux >> Linux Esercitazione >  >> Linux

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

Sono disponibili due tipi di bash for loop. Uno che utilizza la parola chiave "in" con l'elenco dei valori, un altro che utilizza la programmazione C come sintassi.

Questo articolo fa parte della nostra serie di tutorial bash in corso.

Questo spiega entrambi i metodi bash for loop e fornisce 12 diversi esempi su come utilizzare bash for loop negli script della shell.

Segna questo articolo per riferimento futuro, poiché questo è l'unico articolo che avrebbe mai bisogno di fare riferimento a come usare bash for loop con esempi.

Metodo 1:Bash For Loop usando "in" e un elenco di valori

Sintassi:

for varname in list
do
 command1
 command2
 ..
done

Nella sintassi sopra:

  • for, in, do e done sono parole chiave
  • “elenco” contiene un elenco di valori. L'elenco può essere una variabile che contiene più parole separate da spazi. Se list manca nell'istruzione for, allora prende il parametro posizionale che è stato passato nella shell.
  • varname è qualsiasi nome di variabile Bash.

In questa forma, l'istruzione for esegue i comandi racchiusi in un corpo, una volta per ogni elemento nell'elenco. Ad esempio, se l'elenco di valori contiene 5 elementi, il ciclo for verrà eseguito un totale di 5 volte, una per ogni elemento nell'elenco. L'elemento corrente dall'elenco verrà memorizzato in una variabile "varname" ogni volta che si esegue il ciclo. Questo "varname" può essere elaborato nel corpo del ciclo for.

Metodo 2:Bash For Loop usando la sintassi simile a C

La seconda forma del ciclo for è simile al ciclo for nel linguaggio di programmazione "C", che ha tre espressioni (inizializzazione, condizione e aggiornamento).

for (( expr1; expr2; expr3 ))
do
 command1
 command2
 ..
done

Nella bash sopra per la sintassi dei comandi,

  • Prima della prima iterazione, viene valutata expr1. Questo è solitamente usato per inizializzare le variabili per il ciclo.
  • Tutte le istruzioni tra do e done vengono eseguite ripetutamente finché il valore di expr2 è TRUE.
  • Dopo ogni iterazione del ciclo, viene valutata expr3. Questo è solitamente usato per incrementare un contatore di loop.

I seguenti 12 esempi mostrano come eseguire il bash per loop in diversi modi.

1. Valori statici per l'elenco dopo la parola chiave "in"

Nell'esempio seguente, l'elenco dei valori (lun, mar, mer, gio e ven) viene fornito direttamente dopo la parola chiave "in" nel ciclo bash for.

$ cat for1.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Attenzione: L'elenco dei valori non deve essere separato da virgole (lun, mar, mer, gio, ven). La virgola verrà considerata come parte del valore. cioè, invece di "Lun", utilizzerà "Lun" come valore, come mostrato nell'esempio seguente.

$ cat for1-wrong1.sh
i=1
for day in Mon, Tue, Wed, Thu, Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong1.sh
Weekday 1 : Mon,
Weekday 2 : Tue,
Weekday 3 : Wed,
Weekday 4 : Thu,
Weekday 5 : Fri

Attenzione: L'elenco dei valori non deve essere racchiuso tra virgolette. (“lun mar mer gio ven”). Se racchiudi tra virgolette, verrà trattato come un unico valore (invece di 5 valori diversi), come mostrato nell'esempio seguente.

$ cat for1-wrong2.sh
i=1
for day in "Mon Tue Wed Thu Fri"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong2.sh
Weekday 1 : Mon Tue Wed Thu Fri

2. Variabile per l'elenco dopo la parola chiave "in"

Invece di fornire i valori direttamente nel ciclo for, puoi memorizzare i valori in una variabile e utilizzare la variabile nel ciclo for dopo la parola chiave "in", come mostrato nell'esempio seguente.

$ cat for2.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Attenzione :come best practice, dovresti sempre citare le variabili bash quando le fai riferimento. Ci sono poche eccezioni a questa regola di best practice. Questo è uno di loro. Se virgolette la variabile in questo ciclo for, l'elenco di valori verrà trattato come un valore singolo. Molte persone cadono in questa trappola. Fai attenzione e non virgolette la tua variabile nel ciclo for.

$ cat for2-wrong.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in "$weekdays"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2-wrong.sh
Weekday 1 : Mon Tue Wed Thu Fri

3. Non specificare l'elenco; ottenerlo dai parametri posizionali

Se non specifichi la parola chiave "in" seguita da nessun elenco di valori nel ciclo bash for, utilizzerà i parametri posizionali (cioè gli argomenti che vengono passati allo script della shell).

$ cat for3.sh
i=1
for day
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Attenzione: Si prega di fare attenzione se si utilizza questo metodo. Non dovresti includere la parola chiave "in" nel ciclo for. Se lasci la parola chiave "in" senza alcun valore, non utilizzerà il parametro posizionale come mostrato di seguito. Non entrerà nel circuito. cioè for loop non verrà mai eseguito come mostrato nell'esempio seguente.

$ cat for3-wrong.sh
i=1
for day in
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3-wrong.sh Mon Tue Wed Thu Fri

Nota :fai riferimento al nostro articolo precedente per saperne di più sui parametri posizionali di bash.

4. Output del comando Unix come valori di elenco dopo la parola chiave "in"

È possibile utilizzare l'output di qualsiasi comando UNIX/Linux come elenco di valori per il ciclo for racchiudendo il comando in back-tick ` ` come mostrato di seguito.

$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
 echo "Username $((i++)) : $username"
done

$ ./for4.sh
Username 1 : ramesh
Username 2 : john
Username 3 : preeti
Username 4 : jason
..

5. Scorri file e directory in un ciclo for

Per scorrere file e directory in una directory specifica, fai semplicemente cd in quella directory e inserisci * nel ciclo for come mostrato di seguito.

L'esempio seguente scorrerà tutti i file e le directory nella tua home directory.

$ cat for5.sh
i=1
cd ~
for item in *
do
 echo "Item $((i++)) : $item"
done

$ ./for5.sh
Item 1 : positional-parameters.sh
Item 2 : backup.sh
Item 3 : emp-report.awk
Item 4 : item-list.sed
Item 5 : employee.db
Item 8 : storage
Item 9 : downloads

L'uso di * nel ciclo for bash è simile al globbing di file che usiamo nella riga di comando di Linux quando usiamo il comando ls (e altri comandi).

Ad esempio, quanto segue visualizzerà tutti i file e le directory nella tua home directory. Questo è il concetto utilizzato nell'esempio precedente di for5.sh.

cd ~
ls *

Di seguito verranno visualizzati tutti i file *.conf che iniziano con a, b o, c o d nella directory /etc.

$ ls -1 /etc/[abcd]*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf

Lo stesso argomento utilizzato nel comando ls sopra, può essere utilizzato in un ciclo bash for, come mostrato nell'esempio seguente.

$ cat for5-1.sh
i=1
for file in /etc/[abcd]*.conf
do
 echo "File $((i++)) : $file"
done

$ ./for5-1.sh
File 1 : /etc/asound.conf
File 2 : /etc/autofs_ldap_auth.conf
File 3 : /etc/cas.conf
File 4 : /etc/cgconfig.conf
File 5 : /etc/cgrules.conf
File 6 : /etc/dracut.conf

6. Esci dal ciclo for

Puoi uscire da un ciclo for usando il comando 'break' come mostrato di seguito.

$ cat for6.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
 if [ $i -eq 3 ]; then
   break;
 fi
done

$ ./for6.sh
Weekday 1 : Mon
Weekday 2 : Tue

7. Continua dall'alto del ciclo for

In determinate condizioni, puoi ignorare il resto dei comandi nel ciclo for e continuare il ciclo dall'alto (per il valore successivo nell'elenco), utilizzando il comando continue come mostrato di seguito.

L'esempio seguente aggiunge "(WEEKEND)" a sab e dom e "(weekday)" al resto dei giorni.

$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
 echo -n "Day $((i++)) : $day"
 if [ $i -eq 7 -o $i -eq 8 ]; then
   echo " (WEEKEND)"
   continue;
 fi
 echo " (weekday)"
done

$ ./for7.sh
Day 1 : Mon (weekday)
Day 2 : Tue (weekday)
Day 3 : Wed (weekday)
Day 4 : Thu (weekday)
Day 5 : Fri (weekday)
Day 6 : Sat (WEEKEND)
Day 7 : Sun (WEEKEND)

8. Bash for loop usando la sintassi del programma C

Questo esempio usa il 2° metodo di bash for loop, che è simile alla sintassi del ciclo C for. L'esempio seguente genera 5 numeri casuali utilizzando il ciclo for bash in stile C.

$ cat for8.sh
for (( i=1; i <= 5; i++ ))
do
 echo "Random number $i: $RANDOM"
done

$ ./for8.sh
Random number 1: 23320
Random number 2: 5070
Random number 3: 15202
Random number 4: 23861
Random number 5: 23435

9. Infinito Bash for loop

Quando non fornisci l'inizio, la condizione e l'incremento nel ciclo for bash in stile C, diventerà un ciclo infinito. Devi premere Ctrl-C per interrompere il ciclo.

$ cat for9.sh
i=1;
for (( ; ; ))
do
   sleep $i
   echo "Number: $((i++))"
done

Come abbiamo detto sopra, premi Ctrl-C per uscire da questo esempio di ciclo infinito di bash.

$ ./for9.sh
Number: 1
Number: 2
Number: 3

10. Usando la virgola nel ciclo for bash in stile C

Nel ciclo in stile c bash, oltre a incrementare il valore utilizzato nella condizione, puoi anche incrementare qualche altro valore come mostrato di seguito.

Nella sezione di inizializzazione e nella sezione di incremento del ciclo for in stile C bash, puoi avere più valori separandoli con una virgola come mostrato di seguito.

Il seguente ciclo for viene eseguito in totale 5 volte, utilizzando la variabile i. Tuttavia la variabile j inizia con 5 e ottiene un incremento di 5 ogni volta che il ciclo viene eseguito.

$ cat for10.sh
for ((i=1, j=10; i <= 5 ; i++, j=j+5))
do
 echo "Number $i: $j"
done

$ ./for10.sh
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30

11. Intervallo di numeri dopo la parola chiave "in"

Puoi scorrere usando l'intervallo di numeri nel ciclo for "in" usando l'espansione delle parentesi graffe.

L'esempio seguente scorre 10 volte utilizzando i valori da 1 a 10.

$ cat for11.sh
for num in {1..10}
do
 echo "Number: $num"
done

$ ./for11.sh
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
...

12. Intervallo di numeri con incrementi dopo la parola chiave "in"

L'esempio seguente scorre 5 volte utilizzando i valori da 1 a 10, con un incremento di 2, ovvero inizia con 1 e continua ad aumentare di 2, fino a raggiungere 10.

$ cat for12.sh
for num in {1..10..2}
do
 echo "Number: $num"
done

$ ./for12.sh
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9

PS: Non dimenticare di aggiungere questo articolo ai segnalibri come riferimento futuro.


Linux
  1. Bash For Loop Guida ed esempi

  2. 5 migliori estensioni della shell GNOME per il tuo desktop Linux

  3. Qual è la tua shell preferita per il lavoro di amministratore di sistema?

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

  5. Esempi di Bash for loop

Bash For Loops con esempi

Script di shell per principianti - Come scrivere script Bash in Linux

Bash For Loop – La guida più pratica

Bash Shell PS1:10 esempi per rendere il tuo Linux Prompt come Angelina Jolie

Bash Scripting Introduzione Tutorial con 5 esempi pratici

Script Bash per Loop spiegato con esempi