giovedì 13 ottobre 2011

Fammi un case!

Da questo post cambiamo la metodologia di esposizione della parte teorica del progetto.
Il nostro timore è sempre stato quello di trasformare il "Progetto Bash" in qualcosa di troppo scolastico, di troppo formale.
E dato che il timore stava (forse) diventando realtà, abbiamo deciso di rendere più fluido (e forse anche più semplice) il discorso esponendo gli argomenti, di volta in volta trattati, sotto forma di intervista.
Certo, l'intervistatore sono io e l'intervistato è Lightuono. Non poteva essere mica il contrario, vero? :D

L'argomento di oggi è il case!

Caro Light, vogliamo mostrare a bruciapelo la sintassi di Case?

Eccola:

case $variabile in

         valore)
                       comandi
         ;;

         valore)
                       comandi
         ;;


         *)
                     comandi
         ;;

esac

diamo subito una spiegazione, sebbene superficiale

In pratica Case verifica se dentro la variabile è presente quel valore;se è presente esegue i comandi, se non è presente passa al secondo e così via; se non è presente neanche nel secondo, passa all'asterisco


Pretendo che mi dici subito il nome e la funzione di ";;"? :D

Si tratta di un break! Dopo aver eseguito  il primo blocco, supponendo che il valore sia vero, con i ;; dico allo script di uscire dal CASE. Se non metto i ;;, lo script passerà al secondo blocco e questo non va bene.

Che ne dici se facciamo un esempio pratico?

Eccolo!


#!/bin/bash

a=10

case $a in
        1)
          echo "il valore è $a"
        ;;

        2)
          echo "il valore è $a"
        ;;

        3)
          echo "il valore è $a"
        ;;

        *)
          echo "non è presente nessun valore $a"

        ;;
esac

Ora spiegamelo come si deve!

Al case gli passo il valore della variabile $a (che è 10). Lui che fa? Controlla ogni singolo blocco fino a quando non trova il valore cercato; quindi a == 1 ? no!
e passa al secondo; a == 2? no! E così via. Dopo il 3 non ci sono altri blocchi, ma solo *

che sta a significare...

che sta a significare che se non ha trovato il valore della variabile mi deve stampare l'echo del blocco *. Deve dire: "non è presente nessun valore 10"

La somiglianza con l'If a cascata è spaventosa, vero?

Certo! Il case è un IF a cascata più semplice

Vogliamo mettere le due cose a confronto?

Prendiamo questo if a cascata:

#!/bin/bash

a=10

if [ $a -eq 1 ];then
    echo "il valore è $a"
elif [ $a -eq 2 ];then
    echo "il valore è $a"
elif [ $a -eq 3 ];then
    echo "il valore è $a"
else
    echo "non è presente nessun valore $a"
fi


ma questo script è identico all'esempio fatto sopra, solo che incute leggermente paura. Diciamo che è anche esteticamente brutto. :D :D

Esatto! Il case altro non è che un IF a cascata, ma molto più elegante e facilmente leggibile. :)

Certo che, chi ha fatto bene l'IF, con questo confronto ha automaticamente capito il case.

Proprio così.

Che ne dici se ci fermiamo qui e continuiamo la prossima volta?

Lo stavo pensando anch'io :D

Anche se non penso ci sia rimasto molto da dire sull'argomento. Da notare che come l'if termina con fi, anche case termina con il suo rovescio, cioè esac!

Ho fame, molta fame!

Penso che sia meglio chiudere qui prima che il discorso degeneri.

LOL

Io e Lightuono

n.b.1: Light ha creato uno script che ritengo sia favoloso; in pratica è un concentrato di tutto quello che abbiamo fatto finora (escluso il case). Lo troverete qui

Alla prossima :)

Nessun commento:

Posta un commento