Ritorna, dopo qualche settimana di pausa, il mio "prontuario" alla Shell Bash. Tema di oggi saranno quelle operazioni ripetute più volte, ciclicamente. Un esempio, supponete semplicemente di dover stampare a video un messaggio n volte, potete o scrivere n volte la stessa istruzione, oppure usare un ciclo.
Le istruzioni che andremo a vedere sono essenzialmente tre: for, while e until.
Cominiciamo dalla prima, il ciclo for: questa istruzione consente di eseguire una o una serie di istruzioni successive per un numero specificato numero di volte, con la seguente sintassi:
for variabile [in lista] do istruzioni; èè done
Spieghiamo questa sintassi all'apparenza complessa: variabile può essere un nome qualsiasi, il più classico è semplicemente i, in lista non è fondamentale, ma può indicare, ad esempio, in quale ambito applicare le istruzioni successive, che vanno inserite dopo il do, senza punto e virgola alla fine di ogni riga meno che nell'ultima istruzione. Vediamo un piccolo esempio:
#!/bin/bash for ((i=1;i<11;i++));èè do echo $i; done
Questo script stupidissimo scrive i numeri da 1 a 10 a video, uno per ogni riga. Come si vede però, il nome della variabile è semplicemente i, che varia da 1 a 10, e l'istruzione eseguita è una semplice stampa a video della variabile stessa.
Un esempio più concreto? Supponiamo di voler estrarre da un file una serie di informazioni. Per semplicità, supponiamo di avere un file chiamato listafile
, con all'interno una lista di utenti, chiamati semplicemente utente1, utente2, e così via. Lo script precedente, da lanciare nella stessa directory del file listafile
, diventa:
La seconda istruzione che vediamo è il while.
In questo caso si parla di controllo in testa, ovvero viene controllata la condizione di uscita, e se questo test non fallisce, allora si eseguono le istruzioni successive (nel caso precedente invece avevamo una ripetizione per un certo numero stabilito di volte). La sintassi è la seguente:
while CONDIZIONE; do ISTRUZIONI;è doneLo stesso script di esempio visto per il for (quello che stampa a video i numeri da 1 a 10) può essere riscritto usando il while:
#!/bin/bash i="1" è LIM="11"èè while [ $i -lt $LIM ]; do echo $i i=$[$i+1]; doneNell'esempio, l'opzione del while
-lt
sta per "lower than", cioè "minore di", si può usare anche il simbolo matematico "<", ma occorre in questo caso usare le doppie parentesi tonde (( )) (come nel primo esempio). Il ciclo while può essere annidato, ovvero assumere la sintassi:while CONDIZIONE1; èè do BLOCCO-ISTRUZIONI1 èèè while CONDIZIONE2; do BLOCCO-ISTRUZIONI2; done doneInfine, è il momento di dare un'occhiata al ciclo until.
Questo costrutto ha una sintassi praticamente identica al while, ma c'è la differenza fondamentale che le istruzioni all'interno del ciclo vengono eseguite finchè il test non da' risultato positivo:
until CONDIZIONE; do ISTRUZIONI; doneDi nuovo un piccolo (inutile) script di esempio:
#!/bin/bash COUNTER=20 until [ $COUNTER -lt 0 ]; do echo "-" $COUNTER let COUNTER-=1 doneIn questo caso viene effettuato un conto alla rovescia da 20 a 0. Come si vede, finchè COUNTER resta maggiore di zero (ovvero la condizione -lt, minore di, è falsa), il ciclo si ripete.
Until, proprio come while, può essere annidato, e anche annidare ad esempio un while all'interno di un until non costituisce un errore, dipende semplicemente dalle esigenze.
Infine, non possiamo non parlare di continue e break. Si tratta di due istruzioni usate per "forzare" un ciclo. Supponiamo di non conoscere a priori quante volte un ciclo dovrà essere ripetuto, ad esempio supponiamo che un'operazione va ripetuta finchè l'utente non preme un tasto, bene questo è un tipoco caso in cui si usa il break. Non ci sarà una condizione di uscita dal ciclo ma se l'utente preme un tasto allora verrà invocato il break (basta un if nel ciclo!!). Continue invece ha l'effetto opposto, ovvero forza il ritorno al controllo della condizione del ciclo; ad esempio, supponiamo di avere un for all'interno del quale dobbiamo eseguire una certa operazione solo in determinati casi. Bene, basta un controllo (cioè un if) interno al for in cui specifichiamo l'operazione da eseguire e in caso contrario la clausola continue, che altro non fa che tornare alla condizione di controllo in testa.
Alla prossima..