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.