5 esempi utili di Bash For Loop

Home / Linux / 5 esempi utili di Bash For Loop
5 esempi utili di Bash For Loop

Immagina di avere una directory piena di migliaia di file e che ti sia stato chiesto di elaborare questi file uno per uno. Sembra piuttosto noioso, vero? Beh no, se stai usando i cicli For nello script Bash. Il ciclo For nello script bash è uno strumento magico che può aiutarti ad automatizzare qualsiasi attività ripetitiva gestendo in modo efficiente tali file senza sudare troppo. In questo articolo parliamo di cosa sono i cicli for in bash con alcuni esempi pratici per rendere l’automazione un gioco da ragazzi.

Cos’è il ciclo For in Bash Script

Il ciclo For è una struttura di controllo utilizzata per eseguire attività ripetitive o eseguire una serie di comandi un numero specifico di volte. Con il ciclo for puoi scorrere numeri, elenchi, file o persino directory.

Bash For Loop: sintassi stile POSIX

La sintassi in stile POSIX (Portable Operating System Interface) può essere utilizzata con shell conformi a POSIX come bash e può essere utilizzata per scorrere un elenco di file, qualsiasi sequenza o persino l’output di altri comandi. Ecco la sintassi del ciclo for nello script bash:

for <loop_variable> in <list_to_iterate>
do
    <Commands_to_be_executed_in_each_iteration>
done

Nella sintassi sopra, ecco cosa significa tutto:

  • è una variabile definita dall’utente che contiene ogni elemento da .
  • si riferisce all’elenco di elementi su cui è necessario eseguire l’iterazione del ciclo for. Può essere un elenco di numeri, stringhe, output di un comando, ecc.
  • La parola chiave do indica l’inizio del ciclo for.
  • contiene i comandi o le istruzioni che verranno eseguiti per ogni iterazione.
  • La parola chiave done indica la fine del ciclo for.

Vediamo ora alcuni esempi pratici basati sul ciclo for in stile POSIX:

Esempio 1: ciclo attraverso un intervallo dato

#!/bin/bash

# Print numbers from 1 to 5
for i in $(seq 1 5); do
    echo $i
done
utilizzando uno script bash per stampare tutti i numeri interi da 1 a 5

Nello snippet sopra, la parte $(seq 1 5) viene utilizzata per generare un elenco di numeri interi da 1 a 5. Quindi eseguirà il loop dell’elenco uno per uno e ciascun valore verrà stampato su una nuova riga.

stampando i numeri interi da 1 a 5

Esempio 2: ciclo attraverso un array

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "Grapes")

for fruit in "${fruits(@)}"; do
    echo "Fruit: $fruit"
done
script bash per stampare i nomi dei frutti in un array con il ciclo for

Un array è una struttura dati utilizzata per contenere più dati di tipo diverso. Nello snippet sopra:

  • La linea fruits=("Apple" "Banana" "Orange" "Grapes") viene utilizzato per dichiarare l’array contenente quattro nomi di frutti diversi.
  • La linea “for fruit in "${fruits(@)}"; do” imposta il ciclo For. Specifica la variabile “frutta” per contenere il valore dell’elemento corrente e “${fruits(@)}” come array da iterare. IL “@“, entro “${fruits(@)}“, rappresenta tutti gli elementi dell’array.
  • La linea “echo "Fruit: $fruit" ” stampa il nome di ciascun frutto su una nuova riga insieme alla parola “Frutto” durante ogni iterazione.
  • Infine l’ultima riga “done” indica la fine del ciclo for.

Ecco l’output che otterremo dai comandi precedenti:

stampando tutti i nomi dei frutti in un array

Esempio 3: Ciclo con sostituzione di comando

#!/bin/bash
for file in $(ls); do
    echo "File: $file"
done
utilizzando la sostituzione dei comandi per stampare tutti i nomi di file in una directory

Il modo in cui funziona la sostituzione dei comandi è che il comando viene prima eseguito e quindi il ciclo for ripeterà l’intero output del comando. Il comando su cui eseguire l’iterazione è inserito all’interno di “$()“. Nello snippet sopra:

  • Nella linea for file in $(ls); doIL $(ls) parte esegue quindi il comando ‘ls’ e il suo output (l’elenco dei file nella directory corrente) viene utilizzato come input per il ciclo. Il ciclo ripeterà ciascun nome di file trovato nell’output.
  • La linea echo "File: $file" stampa il valore della variabile “file” insieme al prefisso “File: ” durante ogni iterazione. La variabile “file” contiene il nome del file corrente in fase di elaborazione nel ciclo.
  • Infine l’ultima riga “done” indica la fine del ciclo for.

L’output per il ciclo for con sostituzione del comando, come dimostrato nell’esempio precedente, sarebbe:

stampando tutti i nomi di file con lo script bash

Bash For Loop: sintassi stile C

La sintassi in stile C è adatta agli utenti che sono più abituati alla sintassi del ciclo for in altri linguaggi come C, C++, Java, JavaScript, ecc. Ecco la sintassi di base del ciclo for in stile C:

for ((<variable_initialization>; <test_condition>; <step_value>))
do
    <commands_to_execute>
done

Nella sintassi sopra:

  • <variable_initialization> si riferisce al valore iniziale da cui inizierà la variabile del ciclo.
  • <test_condition> definisce la condizione da cui dipenderà l’output; questa condizione viene verificata ad ogni iterazione.
  • <step_value> si riferisce al valore in base al quale la variabile del ciclo deve essere aggiornata.
  • si riferisce ai comandi o alle istruzioni che devono essere eseguiti per ogni iterazione.

Vediamo ora alcuni esempi pratici basati sul ciclo for in stile C:

Esempio 1: stampa i numeri dispari da 1 a 10

!#/bin/bash

for((i = 1; i <= 10; i = i + 1))
do
    if (( i % 2 == 1 ))
    then
        echo "Odd Number: $i"
    fi
done
usando la sintassi in stile ac per il ciclo in bash per stampare i numeri dispari da 1 a 10

Nello snippet sopra:

  • La linea for((i = 1; i <= 10; i = i + 1)) inizializza la variabile del ciclo su 1, controlla se il “valore di i è inferiore o uguale a 10” per ogni iterazione e infine incrementa il valore di i aggiungendo 1 al valore corrente dopo ogni iterazione.
  • if (( i % 2 == 1 )) controlla se il valore del resto dividendo il valore corrente di i con 2 è uguale a 1 o meno –
    • se divisibile, allora la riga echo “Numero dispari: $i” viene eseguita stampando il valore di i.
    • la linea fi indica la fine della condizione if.
  • Infine, l’ultima riga delimita la fine del ciclo for e viene eseguita alla fine.

Ecco l’output che otterrai per il codice sopra:

stampa dei numeri dispari da 1 a 10

Esempio 2: ciclo attraverso un array

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "Grapes")
for ((i = 0; i < ${#fruits(@)}; i++)); do
    echo "Fruit $((i+1)): ${fruits(i)}"
done
script bash con ciclo for per stampare tutti gli elementi in un array

Nel codice sopra:

  • frutta=(“Mela” “Banana” “Arancia” “Uva”) crea un array di tutti i nomi dei frutti.
  • for ((i = 0; i < ${#frutti(@)}; i++)) inizializza innanzitutto la variabile del ciclo “i” su 0 che fungerà anche da variabile indice per l'array, e il ciclo continua finché “ i" è inferiore al numero di elementi nell'array "fruits" (indicato con ${#fruits()}). Il ciclo incrementa "i" di 1 in ogni iterazione.
  • Poiché gli indici dell’array iniziano da 0 ma vogliamo visualizzarli a partire da 1, la riga echo “Fruit $((i+1)): ${fruits(i)}” stampa il valore che è uguale all’indice corrente “ i” più 1.
  • Infine, l’ultima riga indica la fine del ciclo for

Ecco l’output del ciclo for riportato sopra:

stampare i valori in un array

Lascia un commento

Lindirizzo email non verrà pubblicato, i campi obbligatori sono contrassegnati con *