martedì 5 gennaio 2010

bash scripting - if annidati e case (p3)

Prosecuzione naturale del post precedente non poteva essere nient'altro che una breve lezioncina sugli if annidati ed ovviamente il costrutto case.

Cosa sono gli if annidati?
Molto semplice: gli if annidati sono dei semplici if che contengono al loro interno (dopo la clausola then o else) degli altri if, che ovviamente possono avere anch'essi altri if all'interno.

Vediamo subito un esempio:

#! /bin/bash

# legge la scelta
echo "Scegliere la lingua: "
read lingua

if test $lingua = "italiano" # primo if
then
    echo "Ciao!"
    exit 0
else
    if test $lingua = "inglese" # if annidato
    then
        echo "Hello!"
        exit 0
    else
        echo "Non una lingua conosciuta"
        exit 1
    fi # chiude l'if annidato
fi #chiude il primo if

Come al solito il codice è banale: viene chiesto all'utente di inserire una lingua ed in base alla risposta viene stampato un messaggio di saluto.
Si può notare che priva viene controllato se la lingua è uguale ad "italiano", se si si stampa il messaggio e si esce, altrimenti si passa all'if successivo. Quindi si controlla se la lingua è uguale ad "inglese". Se anche questa non è vera verrà stampato un messaggio di errore e viene settato il valore d'uscita ad 1.

Ora, anche se costruire degli if annidati non è molto difficile, si nota subito che più il loro numero aumenta più il codice diventa illeggibile e ben presto faremo fatica a distinguere a quale if appartengono then/else e dove terminano i vari if.
Fortunatamente però abbiamo a disposizione la possibilità di usare il case!
Il case è semplicemente un altro modo di scrivere gli if annidati (o gli if in generale) con una sintassi molto meno complicata.
In poche parole si elencano i possibili valori che la variabile da controllare può assumere uno dopo l'altro.
Ovviamente il case funziona solo per controllare una sola variabile, quindi se nei nostri if annidati controlliamo più variabili non possiamo riscriverli con il case.
Vediamo un esempio:

#! /bin/bash

# legge la scelta
echo "Scegliere la lingua: "
read lingua

# inizio case
case $lingua in
    'italiano') # primo caso
        echo "Ciao!"
        exit 0
    ;; # fine primo caso
    'inglese') # secondo caso
        echo "Hello!"
        exit 0
    ;; # fine secondo caso
    'francese')
        echo "Bonjour!"
        exit 0
    ;;
    'tedesco')
        echo "Hallo!"
        exit 0
    ;;
    'spagnolo')
        echo "Hola!"
        exit 0
    ;;
    *) # caso di default
        echo "Non una lingua conosciuta"
        exit 1
    ;; # fine caso di default
esac # fine del case 

Come vedete lo script fa esattamente la stessa cosa del precedente (con l'aggiunta di qualche lingua in più).
Vediamo la sintassi:
  • case $lingua in--> identifica l'inizio del case con la variabile che verrà controllata.
  • 'italiano')--> è uno dei possibili casi che si possono verificare: le istruzioni che devono essere eseguite sono inserite dopo la parentesi tonda e ;; che chiudono il blocco di istruzioni per il caso
  • *)--> è il caso di default che viene eseguito quando nessuna delle altre condizione viene asserita. Di solito identifica un errore, come nell'esempio
  • esac--> chiude il costrutto case (come per if e fi è "simpaticamente" il contrario della parola che si usa per aprirlo)

2 commenti: