Tutto quello che devi sapere su Bash For Loops in Linux

Tutto quello che devi sapere su Bash For Loops in Linux

Gli script Bash sono un mezzo altamente efficiente per automatizzare le attività, in particolare quelle che sfruttano altri programmi esistenti. Questa automazione richiede spesso di ripetere più volte un'operazione simile, ed è proprio qui che il per ciclo entra in proprio.





Gli amministratori di sistema Linux e Mac in genere hanno familiarità con lo scripting tramite il terminale, ma anche gli utenti Windows possono farlo entra in azione con il sottosistema Windows per Linux .





Come funzionano gli script Bash

Uno script bash è semplicemente un semplice file di testo contenente una serie di comandi che la shell bash può leggere ed eseguire. Bash è la shell predefinita in macOS pre-Catalina e nella maggior parte delle distribuzioni Linux.





Se non hai mai lavorato con uno script di shell prima, dovresti iniziare con il caso più semplice in assoluto. Ciò ti consentirà di esercitarti sui concetti chiave, inclusa la creazione dello script e la sua esecuzione.

Innanzitutto, crea il seguente file in una posizione comoda (idealmente, apri un terminale e vai prima alla directory desiderata):



#!/bin/bash
echo 'Hello, World'

La prima riga dice a qualunque cosa esegua questo programma come eseguirlo (cioè usando l'interprete bash). Il secondo è solo un comando come qualsiasi altro che potresti inserire nella riga di comando. Salva quel file come ciao_mondo.sh , poi:

$ chmod +x hello_world.sh
$ ./hello_world.sh

Il chmod comando sulla prima riga rende eseguibile il file, ovvero può essere eseguito digitandone il nome, come nella seconda riga.





Se vedi le parole Hello, World stampate su una riga nel tuo terminale, allora tutto funziona come richiesto.

Come funzionano i cicli for?

Nella programmazione generale, ci sono due tipi principali di ciclo for: numerico e per ciascuno . Il tipo numerico è tradizionalmente il più comune, ma nell'uso di bash è solitamente il contrario.





I cicli for numerici in genere si concentrano su un singolo numero intero che determina quante iterazioni verranno eseguite, ad esempio:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Questo è un ciclo for dall'aspetto familiare che itererà esattamente 100 volte, a meno che i non venga modificato all'interno del ciclo o un'altra istruzione provochi l'arresto dell'esecuzione del ciclo for.

I cicli Foreach, al contrario, tendono a operare su strutture come elenchi o array e iterare per ogni elemento all'interno di tale raccolta:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Alcuni linguaggi utilizzano una sintassi leggermente diversa che scambia l'ordine della raccolta e dell'elemento:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Per in loop

In bash, il foreach—o per in —il ciclo è più comune. La sintassi di base è, semplicemente:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Ad esempio, per scorrere tre file con nomi espliciti:

orologio attivo 2 vs galassia 3
for file in one.c two.c three.c
do
ls '$file'
done

Se tali file esistono nella directory corrente, l'output di questo script sarà:

one.c
two.c
three.c

Invece di un insieme fisso di file, l'elenco può essere ottenuto tramite un modello glob (uno che include i caratteri jolly, caratteri speciali che rappresentano altri caratteri). Nell'esempio seguente, il ciclo for scorre su tutti i file (nella directory corrente) i cui nomi terminano con '.xml':

for file in *.xml
do
ls -l '$file'
done

Ecco un esempio di output:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Questo può sembrare molto simile a un modo prolisso di fare:

$ ls -l *.xml

Ma c'è una differenza significativa: il ciclo for esegue il ls programma 2 volte separate, con un singolo nome di file passato ad esso ogni volta. Nell'esempio ls separato, il modello glob (*.xml) corrisponde prima ai nomi dei file e poi li invia tutti, come parametri della riga di comando individuali, a un'istanza di ls .

Ecco un esempio che utilizza il WC (conteggio parole) per rendere più evidente la differenza:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

Il WC il programma conta il numero di righe in ciascun file separatamente, quindi stampa un conteggio totale su tutte. Al contrario, se WC opera all'interno di un ciclo for:

for file in *.xml
do
wc -l $file
done

Vedrai ancora il conteggio per ogni file:

44 feed.xml
231 sitemap.xml

Ma non c'è un riassunto totale perché WC viene eseguito in isolamento, ogni volta che il ciclo itera.

Quando una lista non è una lista

C'è un errore molto semplice e comune quando si tratta di cicli for, a causa del modo in cui bash gestisce gli argomenti/stringhe tra virgolette. Il ciclo attraverso un elenco di file dovrebbe essere fatto in questo modo:

for file in one.c two.c

Non così:

for file in 'one.c two.c'

Il secondo esempio racchiude i nomi dei file tra virgolette, il che risulta in un elenco con un solo parametro; il ciclo for verrà eseguito solo una volta. Questo problema può essere evitato utilizzando una variabile in questi casi:

FILES='one.c two.c'
for file in $FILES
do
...
done

Nota che la stessa dichiarazione della variabile deve racchiudere il suo valore tra virgolette!

Windows 10 bloccato nel ciclo di riparazione

Per senza una lista

Senza nulla su cui eseguire l'iterazione, un ciclo for opera su qualunque argomento della riga di comando sia stato fornito allo script quando viene invocato. Ad esempio, se hai uno script chiamato args.sh contenente quanto segue:

#!/bin/sh
for a
do
echo $a
done

Quindi l'esecuzione di args.sh ti darà quanto segue:

$ ./args.sh one two three
one
two
three

Bash riconosce questo caso e tratta per fare qualcosa come l'equivalente di per un in $@ fare dove $@ è una variabile speciale che rappresenta gli argomenti della riga di comando.

Emulazione di un ciclo For numerico tradizionale

Gli script Bash spesso trattano elenchi di file o righe di output di altri comandi, quindi il tipo di ciclo for in è comune. Tuttavia, l'operazione tradizionale in stile c è ancora supportata:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Questa è la forma classica con tre parti in cui:

  1. una variabile viene inizializzata (i=1) quando il ciclo viene incontrato per la prima volta
  2. il ciclo continua finché la condizione (i<=5) is true
  3. ogni volta che si esegue il ciclo, la variabile viene incrementata (i++)

L'iterazione tra due valori è un requisito abbastanza comune che esiste un'alternativa più breve e leggermente meno confusa:

for i in {1..5}
do
echo $i
done

L'espansione della parentesi graffa che si verifica traduce efficacemente il ciclo for di cui sopra in:

for i in 1 2 3 4

Controllo del ciclo più preciso con interruzione e continua

I cicli for più complessi spesso richiedono un modo per uscire in anticipo o riavviare immediatamente il ciclo principale con il valore successivo a turno. Per fare ciò, bash prende in prestito le istruzioni break e continue che sono comuni in altri linguaggi di programmazione. Ecco un esempio che utilizza entrambi per trovare il primo file lungo più di 100 caratteri:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

Il ciclo for qui opera su tutti i file nella directory corrente. Se il file non è un file normale (ad esempio se è una directory), l'istruzione continue viene utilizzata per riavviare il ciclo con il file successivo a turno. Se si tratta di un file normale, il secondo blocco condizionale determinerà se contiene più di 100 caratteri. In tal caso, l'istruzione break viene utilizzata per uscire immediatamente dal ciclo for (e raggiungere la fine dello script).

Conclusione

Uno script bash è un file contenente una serie di istruzioni che possono essere eseguite. Un ciclo for consente di ripetere più volte una parte di uno script. Con l'uso di variabili, comandi esterni e le istruzioni break e continue, gli script bash possono applicare una logica più complessa ed eseguire un'ampia gamma di attività.

Condividere Condividere Tweet E-mail Vale la pena eseguire l'aggiornamento a Windows 11?

Windows è stato ridisegnato. Ma è abbastanza per convincerti a passare da Windows 10 a Windows 11?

Leggi Avanti
Argomenti correlati
  • Programmazione
  • Linux
Circa l'autore Bobby Jack(58 articoli pubblicati)

Bobby è un appassionato di tecnologia che ha lavorato come sviluppatore software per quasi due decenni. È appassionato di giochi, lavora come editor di recensioni presso Switch Player Magazine ed è immerso in tutti gli aspetti dell'editoria online e dello sviluppo web.

Altro da Bobby Jack

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti