martedì 22 novembre 2011

Il ciclo until

 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

4 commenti:

  1. Ciao!
    Una 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 ;)

    RispondiElimina
  2. @FrankRock74

    mhmh 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.

    RispondiElimina
  3. 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 ;(

    Poi riprovo e ti faccio sapere ;)
    (Posterò anche il codice che ho sempre cancellato...)

    Buon sabato sera!!

    RispondiElimina
  4. Eccomi... :)
    Un 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

    RispondiElimina