9 Esempi di cicli for negli script Bash di Linux

9 Esempi di cicli for negli script Bash di Linux

Punti chiave

  • Il ciclo for di Bash è uno strumento versatile che può funzionare con numeri, parole, matrici, variabili della riga di comando o l’output di altri comandi.
  • I semplici cicli for possono essere utilizzati con elenchi numerici o elenchi di parole, consentendo di ripetere una sezione di codice per ciascun valore nell’elenco.
  • Il ciclo for può essere utilizzato anche con intervalli di numeri, nomi di file, parametri della riga di comando, array di parole e array associativi, fornendo flessibilità nelle attività di scripting.

Il versatile forciclo di Bash fa molto di più che ripetere 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 di programmazione hanno un modo di gestire i loop. Un loop è una sezione di codice che desideri venga eseguita ripetutamente. Invece di digitare la stessa serie di istruzioni nello script , ancora e ancora, un ciclo ripeterà più e più volte una sezione di codice per te.

Il ciclo Bash forè molto flessibile. Può funzionare con numeri, parole, matrici, variabili della riga di comando o l’output di altri comandi. Questi vengono utilizzati nell’intestazione del ciclo. L’intestazione indica con cosa sta lavorando il ciclo, ad esempio numeri o stringhe, e quale è la condizione finale che interromperà il ciclo.

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

Una variabile chiamata contatore o iteratore del ciclo 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 del tipo di dati successivo su cui il ciclo sta eseguendo l’iterazione. Ciò consente al ciclo di lavorare a turno con i valori di ciascuno degli elementi di dati 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 cicli che utilizzano elenchi numerici

Puoi eseguire un forciclo sulla riga di comando. Questo comando crea ed esegue un forciclo semplice. L’iteratore è una variabile chiamata i. Assegneremo iciascuno 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è stato ripetuto l’intero elenco di numeri.

for i in 1 2 3 4 5; do echo $i; done

un ciclo for che conta da 1 a 5

È importante notare qui che la variabile iviene 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.

for i in 3 5 7 9 11 44; do echo $i; done

un ciclo for che conta attraverso un elenco non sequenziale di numeri

Non fa alcuna differenza per il forciclo. Inizia da un’estremità dell’elenco e utilizza ciascun valore a turno, finché non vengono utilizzati tutti i valori nell’elenco.

Né è necessario che i numeri siano in ordine crescente. Possono essere in qualsiasi ordine.

for i in 3 43 44 11 9; do echo $i; done

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

per cicli che utilizzano elenchi di parole

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

#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone

Dovrai utilizzare chmodper rendere eseguibile lo script e qualsiasi altro script che copi da questo articolo. Sostituisci semplicemente il nome dello script ogni volta che usi il chmodcomando.

chmod +x word-list.sh

Rendere eseguibile uno script con chmod

Eseguiamo lo script.

./word-list.sh

Un ciclo for che funziona attraverso un elenco di parole

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

per loop con intervalli di numeri

Se volessi che un forciclo 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/bashfor i in {1..10}do echo "Loop spin:" $idone

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

Ecco come funziona:

./number-range.sh

Un ciclo for che utilizza un intervallo di numeri

È possibile includere un altro numero che definisce la dimensione del passo che l’iteratore deve utilizzare per scorrere i numeri nell’intervallo. Questo script, “number-range2.sh”, utilizzerà un intervallo compreso tra 0 e 32 e una dimensione del passo pari a 4.

#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone

L’iteratore avanza attraverso l’intervallo di numeri a salti di quattro.

./number-range2.sh

Un ciclo for che utilizza un passo dell'iteratore pari a 4

per cicli che utilizzano nomi di file

Poiché possiamo elaborare elenchi di parole, possiamo far funzionare i nostri script con i nomi di file. Questo script si chiama “filenames.sh”.

#!/bin/bashfor file in word-list.sh number-range.sh number-range2.sh filenames.shdo ls -lh "$file"done

Sarebbe piuttosto inutile avere uno script che faccia solo quello che lspuò fare, ma dimostra come accedere ai nomi dei file all’interno del corpo del loop.

./filenames.sh

Un ciclo for che utilizza un elenco di nomi di file

In modo simile all’utilizzo dell’intervallo numerico, 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 abbiamo bisogno di conoscere in anticipo i nomi dei file.

Questo script si chiama “filenames2.sh”. Abbiamo sostituito l’elenco dei nomi di file con il modello di nome file “*.sh” per fare in modo che lo script riporti tutti i file di script nella directory corrente.

#!/bin/bashfor file in *.shdo ls -lh "$file"done

Ecco il risultato.

./filenames2.sh

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

per i cicli che utilizzano i parametri della riga di comando

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

Questo è “nomefile3.sh”.

#!/bin/bashfor file in $*do ls -lh "$file"done

Chiederemo nomi di file che iniziano con “n” e hanno un’estensione SH.

./filenames3.sh n*.sh

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

Possiamo anche passare in più di un modello 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

La variabile iteratore fileassume il valore di ciascuno dei parametri della riga di comando. I modelli di nome file vengono espansi e tutti i nomi file vengono elaborati nel corpo del loop.

C-like per Loops

Bash supporta il classico ciclo for a tre termini, come quelli presenti 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 del ciclo.
  • Il test per verificare se il ciclo continua o finisce.
  • 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’affermazione ” i<=10“è vera. Non appena iraggiunge 11, il forciclo si fermerà. L’iteratore viene aumentato di uno, ad ogni rivoluzione del ciclo.

#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone

Eseguiamo questo script.

./c-like.sh

Un ciclo for a tre termini o simile a C

Il ciclo di tipo C forconsente la facile creazione di forcicli che hanno requisiti leggermente strani. Questo ciclo inizia da 15 e conta all’indietro in passi di 3. Questo è “c-like2.sh”

#!/bin/bashfor ((i=15; i>0; i-=3))do echo "Loop number:" $idone

Quando lo eseguiamo, dovrebbe saltare all’indietro in passi di tre.

./c-like2.sh

Un ciclo for simile a C che conta all'indietro

Infinito per cicli

Puoi anche utilizzare questo formato di forloop per creare un loop infinito. Tutto quello che devi fare è rimuovere tutti gli elementi dall’intestazione del ciclo, in questo modo. Questo è “infinite.sh”.

#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done

Dovrai premere Ctrl+C per interrompere il ciclo.

./infinite.sh

Un ciclo for infinito in stile C

per cicli che utilizzano matrici di parole

Possiamo facilmente scorrere una serie di parole. Dobbiamo fornire il nome dell’array nell’intestazione del ciclo e l’iteratore esaminerà tutte le voci nell’array. Questo è “word-array.sh”.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone

Tutte le distribuzioni sono elencate per noi.

./word-array.sh

Un ciclo for che utilizza un array di parole

Il comando continua

Se vuoi che il ciclo passi sopra una voce particolare, verifica se l’iteratore corrisponde a quella voce e usa il continuecomando. Il continuecomando abbandona la rotazione corrente del ciclo. Incrementa l’iteratore e avvia il giro successivo del ciclo, presupponendo che la voce che desideri 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/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then continue fi echo $distrodone

“Arch” non viene visualizzato nella finestra del terminale.

./word-array2.sh

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

Il comando di pausa

Il breakcomando esce dal ciclo e impedisce ulteriori elaborazioni.

Questo è “word-array3.sh”. È uguale allo script precedente ma continuesostituito da break.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then break fi echo $distrodone

Quando l’iteratore contiene “Arch”, il ciclo for abbandona qualsiasi ulteriore elaborazione.

./word-array3.sh


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

per 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 cercate in base alla chiave o al valore. A causa della relazione bidirezionale tra chiave e valore, sono anche chiamati dizionari di dati.

Possiamo scorrere un array associativo utilizzando un forciclo. Questo script è “associative.sh”. Definisce un array associativo con quattro voci al suo interno, una per ciascuno di “cane”, “gatto”, “pettirosso” e “umano”. Queste sono le chiavi. I valori rappresentano il numero (predefinito) di gambe di ciascuno.

#!/bin/bashdeclare -A animals=([dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged)for legs in ${!animals[@]}do if [ ${animals[$legs]} == "Two-legged" ]; then echo ${legs} fidone

L’iteratore si chiama legs. Tieni presente che l’intestazione del ciclo contiene un !punto esclamativo “”. Questo non agisce come operatore logico NOT, fa parte della sintassi dell’array associativo. È necessario cercare nell’array.

Il corpo del ciclo esegue un test di confronto tra stringhe. Se il valore del membro dell’array è “Two-leged”, stampa il valore della chiave nella finestra del terminale. Quando lo eseguiamo, lo script stampa le creature a due zampe.

./associative.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 scorrerli con un forciclo. È necessario fare attenzione alle espansioni inaspettate dei nomi di file, ma nei casi più semplici va bene.

Questo script è “command.sh”. Utilizza lse wcper fornire un elenco ordinato di nomi di file di script, insieme al conteggio di righe, parole e byte.

#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done

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

./command.sh

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

L’abbagliante per Loop

Il forloop è uno strumento di scripting versatile e di facile comprensione. Ma per quanto flessibile sia, non dimenticare che esistono altri cicli per un motivo. Non lasciarti confondere pensando che il forloop sia tutto ciò di cui avrai bisogno.

Il whileloop, ad esempio, è molto più adatto per certe cose rispetto al forloop, come leggere righe da un file .

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *