back to top

I cicli FOR e WHILE – Guida Shell Scripting

Un ciclo (o iterazione) è una ripetizione di una determinata azione per un dato numero di volte sulla base di un dato delimitatore. Per realizzare un ciclo in ambiente di shell scripting si usa for oppure while. Vediamoli entrambi.

Il ciclo for

Il ciclo FOR crea un iterazione sulla base di una data lista di valori o di una data condizione. Vediamo un esempio:

#!/bin/sh

for X in 1 2 3 4 5
do
   echo $X
done

In questo caso il ciclo for si ripete per ogni valore specificato (nel nostro caso verranno stampati i numeri da 1 a 5, ma avremmo potuto usare anche valori non sequenziali oppure non numerici).

Avremmo potuto scrivere lo stesso esempio anche in questo modo:

for X in $(seq 5)
do 
    echo $X
done

In pratica abbiamo utilizzato il comando seq per creare una sequenza numerica; ovviamente l’utilità di questo comando è maggiore tanto più è estesa la sequenza che desideriamo ciclare.

Il comando seq può essere utilizzato in tre modi differenti:

  • specificando solo il valore di arrivo (come nel nostro esempio);
  • specificando, nell’ordine, sia il valore di partenza che quello di arrivo;
  • specificando, nell’ordine: il valore di partenza, l’incremento, il valore di arrivo;

Si noti che il ciclo for nella Bourne Shell NON prevede la sintassi:

for (( X=0; X<10; X++ ))
do
   echo $X
done

La sintassi esposta nell’esempio qui sopra, infatti, appartiene a Bash e per essere eseguita correttamene deve essere settato, nella prima linea dello script, il riferimento alla shell utilizzata, quindi:

#!/bin/bash

e non

#!/bin/sh

In caso contrario riceveremo un messaggio di errore: "Syntax error: Bad for loop variable".

Il ciclo while

Altro modo di creare iterazioni all’interno dei nostri script è l’utilizzo di WHILE. Grazie a while si ripetono determinate azioni fino a quando la condizione limite risulta soddisfatta.

#!/bin/sh

X=1

while [ $X -le 5 ]
do
   echo $X
   X=`expr $X + 1`
done

Nel nostro caso il ciclo continerà fino a quando la condizione limite (X minore o uguale a 5) risulta vera stampando, quindi, una sequenza numerica da 1 a 5.

break e continue

Due comandi molto importanti nella gestione dei loop sono break e continue.

Il comando break serve per interrompere il ciclo in modo arbitrario. Vediamo un esempio di ciclo while interrotto con break:

#!/bin/sh

X=1

while [ $X -le 20 ]
do
   echo $X
   if [ $X -eq 5 ]
   then
      break
   fi 
   X=`expr $X + 1`
done

Nel nostro esempio il ciclo verrà interrotto quando la nostra variabile contatore avrà raggiunto il valore di 5.

Attraverso break è anche possibile interrompere più cicli annidiati:

#!/bin/sh

for X1 in 1 2 3
do
   for X2 in 0 5
   do
      if [ $X1 -eq 2 -a $X2 -eq 0 ]
      then
         break 2
      else
         echo "$X1 $X2";
      fi
   done
done

In questo esempio abbiamo introdotto una doppia condizione, quando verificata questa portera allo stop di entrambi i cicli, per farlo si usa la sintassi:

break n

Dove "n" indica il i ciclo da cui si desidera uscire (n deve essere maggiore o uguale di 1).

Mentre break interrompe il ciclo, il comando continue lo fa proseguire semplicemente saltando l’iterazione corrente. Il funzionamento e la sintassi sono i medesimi visti per break.

Pubblicità
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).