9 Esempi di loop for negli script Bash di Linux

Pubblicato: 2022-08-19
Riga di comando di Linux su un laptop su sfondo blu.
fatmawati achmad zaenuri/Shutterstock.com

Il versatile Bash for loop fa molto di più che girare un determinato numero di volte. Descriviamo le sue numerose varianti in modo che tu possa usarle con successo nei tuoi script Linux.

Il ciclo for

Tutti i linguaggi di scripting e programmazione hanno un modo per gestire i loop. Un ciclo è una sezione di codice che si desidera venga eseguita ripetutamente. Invece di digitare lo stesso insieme di istruzioni nello script, ancora e ancora, un ciclo ripeterà una sezione di codice più e più volte per te.

9 esempi di script Bash per iniziare su Linux
CORRELATI 9 Esempi di script Bash per iniziare su Linux

Il Bash for loop è molto flessibile. Può funzionare con numeri, parole, matrici, variabili della riga di comando o l'output di altri comandi. Questi sono usati nell'intestazione del ciclo. L'intestazione determina con cosa sta lavorando il ciclo, numeri o stringhe, per esempio, e qual è la condizione finale che interromperà il ciclo.

Il corpo del ciclo contiene il codice che si desidera venga ripetuto. Contiene ciò che vuoi che il ciclo faccia . Il corpo del ciclo può contenere qualsiasi comando di script valido.

Una variabile denominata contatore di ciclo o iteratore viene utilizzata per scorrere un intervallo di valori o un elenco di elementi di dati. Per ogni ciclo, l'iteratore assume il valore del numero, della stringa o di qualsiasi altro tipo di dati su cui il ciclo sta iterando. Ciò consente al ciclo di lavorare con i valori di ciascuno degli elementi di dati a turno, o anche in alcuni casi di manipolare gli elementi di dati stessi.

Semplice per i loop

Se stai cercando di scrivere il tuo primo ciclo for, questi semplici esempi ti aiuteranno a iniziare.

per i loop utilizzando elenchi numerici

È possibile eseguire un ciclo for sulla riga di comando. Questo comando crea ed esegue un semplice ciclo for . L'iteratore è una variabile chiamata i . Assegneremo i a ciascuno dei valori nell'elenco dei numeri, a turno. Il corpo del ciclo stamperà quel valore nella finestra del terminale. La condizione che termina questo ciclo è quando i ripetuto l'intero elenco di numeri.

 per i in 1 2 3 4 5; fai eco $i; fatto 

un ciclo for che conta da 1 a 5

È importante notare qui che la variabile i viene aumentata di uno ogni volta che il ciclo gira, ma questo perché l'elenco dei numeri aumenta di uno ogni volta.

Questo elenco di numeri inizia da 3 e sale a passi di due, quindi salta arbitrariamente a 44.

 per i in 3 5 7 9 11 44; fai eco $i; fatto 

a ciclo for che conta attraverso un elenco di numeri non sequenziali

Non fa alcuna differenza per il ciclo for . Inizia a un'estremità dell'elenco e utilizza ogni valore a turno, fino a quando tutti i valori nell'elenco non sono stati utilizzati.

Né i numeri devono essere in ordine crescente. Possono essere in qualsiasi ordine.

 per i in 3 43 44 11 9; fai eco $i; fatto 

a ciclo for che conta attraverso un elenco di numeri non ordinato

per i loop utilizzando elenchi di parole

Possiamo altrettanto facilmente fare lo stesso con le parole. Copia il testo dello script in un editor e salvalo come "word-list.sh".

 #!/bin/bash

for word in Questa è una sequenza di parole
fare 
  eco $parola
fatto

Dovrai usare chmod per rendere eseguibile lo script e qualsiasi altro script che copi da questo articolo. Basta sostituire il nome dello script ogni volta che usi il comando chmod .

 chmod +x lista-parole.sh 

Rendere eseguibile uno script con chmod

Eseguiamo lo script.

 ./lista-parole.sh 

Un ciclo for che lavora su un elenco di parole

Proprio come ha fatto con i numeri, l'iteratore, in questo esempio la word variabile, si fa strada attraverso l'elenco di elementi di dati fino a raggiungere la fine dell'elenco. Il corpo del ciclo accede al valore nella variabile word e quindi ogni parola nell'elenco viene elaborata.

per i loop con intervalli di numeri

Se si desidera che un ciclo for venga eseguito 100 volte, sarebbe piuttosto noioso dover digitare una sequenza di 100 numeri nell'intestazione del ciclo. Gli intervalli di numeri consentono di specificare solo il primo e l'ultimo numero.

Questo script è "number-range.sh".

 #!/bin/bash

per i in {1..10}
fare
  echo "Giro in loop:" $i
fatto

L'intervallo di numeri è definito tra parentesi graffe “ {} ” con due punti “ .. ” che separano i numeri che iniziano e terminano l'intervallo. Assicurati di non includere spazi bianchi nella definizione dell'intervallo.

Ecco come funziona:

 ./intervallo-numeri.sh 

Un ciclo for che utilizza un intervallo di numeri

Puoi includere un altro numero che definisce la dimensione del passaggio che l'iteratore dovrebbe usare per scorrere i numeri nell'intervallo. Questo script, "number-range2.sh", utilizzerà un intervallo compreso tra 0 e 32 e una dimensione del passaggio di 4.

 #!/bin/bash

per i in {0..32..4}
fare
  echo "Giro in loop:" $i
fatto

L'iteratore percorre l'intervallo di numeri con salti di quattro.

 ./intervallo-numeri2.sh 

Un ciclo for utilizzando un passaggio iteratore di 4

per i loop utilizzando nomi di file

Poiché possiamo elaborare elenchi di parole, possiamo far funzionare i nostri script con i nomi dei file. Questo script è chiamato "filenames.sh".

 #!/bin/bash

per il file in elenco di parole.sh intervallo di numeri.sh intervallo di numeri2.sh nomi di file.sh
fare
  ls -lh "$file"
fatto

Sarebbe abbastanza inutile avere uno script che faccia solo ciò che può fare ls , ma dimostra come accedere ai nomi dei file all'interno del corpo del ciclo.

 ./nomefile.sh 

Un ciclo for che utilizza un elenco di nomi di file

In modo simile all'utilizzo dell'intervallo di numeri, possiamo utilizzare un modello di file nell'intestazione del ciclo per specificare i file che vogliamo elaborare. Ciò evita molte digitazioni e significa che non è necessario conoscere in anticipo i nomi dei file.

Questo script è chiamato "filenames2.sh". Abbiamo sostituito l'elenco dei nomi di file con il modello di nome file "*.sh" per avere il rapporto di script su tutti i file di script nella directory corrente.

 #!/bin/bash

per il file in *.sh
fare
  ls -lh "$file"
fatto

Ecco l'output.

 ./nomefile2.sh 

Un ciclo for che utilizza un modello di file di *.sh

per i loop utilizzando i parametri della riga di comando

Possiamo aggiungere un po' più di flessibilità passando il modello del nome del file sulla riga di comando. La variabile $* rappresenta tutti i parametri della riga di comando passati allo script.

Questo è "filenames3.sh".

 #!/bin/bash

per file in $*
fare
  ls -lh "$file"
fatto

Chiederemo nomi di file che iniziano con "n" e hanno un'estensione SH.

 ./filenames3.sh n*.sh 

Un ciclo for che prende un modello di file come parametro della riga di comando

Possiamo anche passare in più di uno schema alla volta.

 ./filenames3.sh n*.sh .bashrc 

Un ciclo for che prende un modello di file e i parametri della riga di comando di un nome file

Il file della variabile iteratore assume il valore di ciascuno dei parametri della riga di comando. I modelli di nomi di file vengono espansi e tutti i nomi di file vengono elaborati nel corpo del ciclo.

CORRELATI: Come lavorare con le variabili in Bash

C-like per Loops

Bash supporta il classico ciclo for a tre termini, come quelli che si trovano nel linguaggio di programmazione C. Sono chiamati cicli for a tre termini perché ci sono tre termini nell'intestazione del ciclo.

  • Il valore iniziale dell'iteratore di ciclo.
  • Il test per verificare se il ciclo continua o termina.
  • L'incremento, o il decremento, dell'iteratore.

Questo script è "c-like.sh".

L'iteratore I è impostato su 1 all'inizio del ciclo e il ciclo verrà eseguito finché l'istruzione " i<=10 " è vera. Non appena raggiungo 11 i il ciclo for si interrompe. L'iteratore viene aumentato di uno, ogni giro del ciclo.

 #!/bin/bash

for (( i=1; i<=10; i++ ))
fare 
  echo "Numero loop:" $i
fatto

Eseguiamo questo script.

 ./c-like.sh 

Un ciclo for a tre termini o tipo C

Il ciclo for in stile C consente la facile creazione di cicli for con requisiti leggermente dispari. Questo ciclo inizia a 15 e conta all'indietro a passi di 3. Questo è "c-like2.sh"

 #!/bin/bash

per (( i=15; i>0; i-=3 ))
fare 
  echo "Numero loop:" $i
fatto

Quando lo eseguiamo, dovrebbe saltare all'indietro a passi di tre.

 ./c-like2.sh 

Un ciclo in stile C per il conteggio all'indietro

Infinito per loop

Puoi anche usare questo formato di ciclo for per creare un ciclo infinito. Tutto quello che devi fare è rimuovere tutti gli elementi dall'intestazione del ciclo, in questo modo. Questo è "infinito.sh".

 #!/bin/bash

per (( ; ; ))
fare
  echo "Premi Ctrl+C per interrompere..."
  dormire 1
fatto

Dovrai premere Ctrl+C per interrompere il ciclo.

 ./infinito.sh 

Un ciclo for infinito simile a una C

per i cicli che utilizzano matrici di parole

Possiamo facilmente scorrere una serie di parole. È necessario fornire il nome dell'array nell'intestazione del ciclo e l'iteratore esaminerà tutte le voci nell'array. Questo è "word-array.sh".

 #!/bin/bash

distribuzioni=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

per la distribuzione in $distributions
fare
  eco $distro
fatto

Tutte le distribuzioni sono elencate per noi.

 ./array-parole.sh 

Un ciclo for che utilizza un array di parole

Il comando continua

Se si desidera che il ciclo esegua un passaggio su una voce particolare, verificare se l'iteratore corrisponde a tale voce e utilizzare il comando continue . Il comando continue abbandona la rotazione corrente del ciclo. Incrementa l'iteratore e avvia il giro successivo del ciclo, supponendo che la voce che vuoi saltare non sia l'ultimo elemento nell'elenco.

Questo è "word-array2.sh". Supera la voce dell'array "Arch" ma elabora tutti gli altri membri dell'array.

 #!/bin/bash

distribuzioni=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

per la distribuzione in $distributions
fare
  if [[ "$distro" == "Arco" ]] ;
    poi
    Continua
  fi
  eco $distro
fatto

"Arch" non appare nella finestra del terminale.

 ./array-parole2.sh 

Un ciclo for che salta una voce in un array di parole a causa del comando continue

Il comando di pausa

Il comando break interrompe il ciclo e impedisce ulteriori elaborazioni.

Questo è "word-array3.sh". È lo stesso dello script precedente con continue sostituito da break .

 #!/bin/bash

distribuzioni=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

per la distribuzione in $distributions
fare
  if [[ "$distro" == "Arco" ]] ;
    poi
    rompere
  fi
  eco $distro
fatto

Quando l'iteratore contiene "Arch", il ciclo for abbandona ogni ulteriore elaborazione.

 ./array-parole3.sh 

Un ciclo for che abbandona l'ulteriore elaborazione a causa del comando break

per i cicli che utilizzano array associativi

In Bash 4 e versioni successive, gli array associativi consentono di creare elenchi di coppie chiave-valore che possono essere ricercate in base alla chiave o al valore. A causa della relazione bidirezionale tra la chiave e il valore, vengono anche chiamati dizionari di dati.

Cosa sono i dizionari Bash su Linux e come li usi?
CORRELATI Cosa sono i dizionari Bash su Linux e come li usi?

Possiamo scorrere un array associativo usando un ciclo for . Questo script è "associative.sh". Definisce una matrice associativa con quattro voci, una per ciascuno di "cane", "gatto", "pettirosso" e "umano". Queste sono le chiavi. I valori sono il numero (predefinito) di gambe che ciascuno ha.

 #!/bin/bash

dichiarare -A animali=( [cane]=A quattro zampe [gatto]=A quattro zampe [pettirosso]=A due zampe [umano]=A due zampe )

per le gambe in ${!animals[@]}
fare
  if [ ${animals[$gambe]} == "A due zampe" ]; poi 
    eco ${gambe}
  fi
fatto

L'iteratore è chiamato legs . Nota che l'intestazione del ciclo contiene un " ! " punto esclamativo. Questo non agisce come operatore NOT logico, fa parte della sintassi associativa dell'array. È necessario eseguire la ricerca nell'array.

Il corpo del ciclo esegue un test di confronto di stringhe. Se il valore del membro dell'array è "a due gambe", stampa il valore della chiave nella finestra del terminale. Quando lo eseguiamo, lo script stampa le creature a due zampe.

 ./associativo.sh 

Utilizzo di un ciclo for per estrarre elementi da un array associativo

Iterazione sull'output dei comandi

Se hai un comando o una sequenza di comandi che producono un elenco di qualcosa, come i nomi dei file, puoi scorrere attraverso di essi con un ciclo for . Devi fare attenzione alle espansioni impreviste dei nomi dei file, ma in casi semplici va bene.

Questo script è "command.sh". utilizza ls e wc per fornire un elenco ordinato di nomi di file di script, insieme ai conteggi di righe, parole e byte.

 #!/bin/bash

for i in $(ls *.sh | sort);
fare 
  eco $(wc $i)
fatto

Quando lo eseguiamo otteniamo le statistiche per ogni file, con i file elencati in ordine alfabetico.

 ./comando.sh 

Utilizzo di un ciclo for per scorrere l'output di due comandi convogliati

L'abbagliante per Loop

Il ciclo for è uno strumento di scripting versatile e di facile comprensione. Ma per quanto flessibile sia, non dimenticare che esistono altri loop per un motivo. Non lasciarti abbagliare dal pensare che il ciclo for sia tutto ciò di cui avrai bisogno.

Come elaborare un file riga per riga in uno script Bash Linux
CORRELATI Come elaborare un file riga per riga in uno script Bash Linux

Il ciclo while , ad esempio, è molto più adatto per certe cose rispetto al ciclo for , come leggere le righe da un file.

Scrivere buoni script significa utilizzare lo strumento più adatto al compito da svolgere. Il ciclo for è un ottimo strumento da avere nella tua cassetta degli attrezzi di trucchi.