Salve!
Ed eccoci al terzo ed ultimo post teorico dedicato ai cicli. Dalla prossima volta parleremo di altro. :)
Oggi ci occuperemo di until.
Il ciclo until può essere sintetizzato nei seguenti termini: "Fino a quando è falsa la condizione, esegui (itera) le istruzioni contenute tra do e done."
Eccone la sintassi:
until [ condizione ]
do
comando(i)...
done
Ovviamente può essere scritto anche su una sola riga:
until [ condizione ]; do istruzioni; done
O, ancora meglio, così:
until [ condizione ]; do
istruzioni
done
Cerchiamo di capire insieme cosa fa until. Lo facciamo con un esempio.
#!/bin/bash
Password="b4"
until [ $Password == "5b4n0" ];do
read -p "digita la password in modo corretto:" Password
sleep 2
done
if [ $Password == "5b4n0" ];then
echo "accesso consentito"
sleep 2
echo "ma dove vuoi andare? :D"
fi
exit 0
Salviamolo in un file di testo, sulla scrivania, e nominiamolo pass.sh
Spostiamoci col terminale sulla Scrivania
$ cd Scrivania
rendiamolo eseguibile
$ chmod +x pass.sh
lanciamolo
$ ./pass.sh
In questo script, anzitutto, assegno alla variabile Password il valore "b4" e, fino a quando b4 sarà uguale a 5b4n0, quindi fino a quando la condizione sarà falsa, until ripeterà, ogni due secondi, "digita la password in maniera corretta".
Solo se digiteremo la password giusta, cioè 5b4n0, la condizione diventerà vera e si uscirà dal ciclo.
Penso che il discorso sia abbastanza chiaro. Vi ricordate While? Ebbene, until fa esattamente il contrario; infatti, mentre while finisce di iterare se la condizione diventa falsa, until smetterà di ciclare solo se la condizione diventa vera.
Facciamo un altro esempio.
#!/bin/bash
a=1
until [ "$a" -eq 10 ]; do
echo $a
a=$((a+1))
done
exit 0
Anche qui, fino a quando la condizione tra le parentesi quadre sarà falsa (infatti $a non è uguale a 10, 1 non può essere uguale a 10), until ciclerà il comando compreso tra do e done, cioè stamperà a video la variabile $a.
Subito dopo il comando echo abbiamo aggiunto un'espressione aritmetica che va a cambiare, ciclo dopo ciclo, il valore della variabile $a, cioè per ogni ciclo si avrà $a+1. In altri termine, all'inizio la variabile $a è uguale a 1;
Per ogni ciclo, iterazione, la variabile $a crescerà di una unità fino ad arrivare a 10.
Quando ciò avviene, cioè quando la variabile $a sarà uguale a 10, essa andrà a rendere vera la condizione tra le parentesi quadre. Ragion per cui until terminerà la sua iterazione. Fine. :)
io & Lightuono
PS1 Gli esempi fatti in questi post non risolvono alcun problema esistenziale. Vogliono soltanto far capire il ragionamento che sta dietro ai vari argomenti trattati. Capito quello, ognuno può sbizzarrirsi con la propria fantasia. :D
PS2 Quanto prima aggiungeremo una nuova sessione al progetto bash. Si chiamerà "Botta & Risposta". Si tratterà di post un pò particolari, che saranno pubblicati sia sul mio blog che su quello di lightuono, senza distinzione tra teoria e pratica. Il nostro caro indice, come al solito, coordinerà il tutto :D
Ciao!
RispondiEliminaUna domanda :D
Prendendo l' ultimo esempio, se io volessi sapere solo il totale della variabile $a dopo "done"
come faccio?
Ho notato che dopo done le variabili restituiscono 0 come valore.
Possibile che bisogna esportarla per avere il totale alla fine del ciclo? Oppure c'è un modo per scrivere questa cosa?
Grazie ;)
@FrankRock74
RispondiEliminamhmh mi sembra strano che la variabile $a restituisca 0. Appena $a ha valore 10 esce dal ciclo e quindi mettendo un
echo "Valore di a: $a"
Lui visualizza il numero 10.
8) Eppure avevo fatto diverse prove e mi dava sempre zero come risultato, usando un ciclo for, finchè rimanevo dentro era tutto ok, ma se davo echo $a dopo done era = zero ;(
RispondiEliminaPoi riprovo e ti faccio sapere ;)
(Posterò anche il codice che ho sempre cancellato...)
Buon sabato sera!!
Eccomi... :)
RispondiEliminaUn esempio con il ciclo while...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cont=0
ls ~ |
while read i
do
let cont=$cont+1
echo "Progressivo: $cont → "$i""
done
echo
echo "Totale: $cont files"
echo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Totale: 0 files
Xchè?
Come faccio a scrivere il totale in questo esempio?
Ciao e Grazie!!
Frank