Finora abbiamo parlato del costrutto IF nella sua forma più semplice. Ma ci sono delle volte che bisogna costruire alcuni costrutti IF più avanzati sfruttando l’annidamento. Annidare un IF significa costruire un IF dentro un IF e dentro un’altro IF. In tutto questo ci viene incontro un secondo controllo, detto Elif, che prende il post dell’Else e che permette di controllare ulteriomente il valore.
Il classico costrutto dell’IF, come abbiamo visto nei precedenti post, è il seguente:
if [ espressione ]; then Se l'espressione è vera, eseguo dei comandi o visualizzo qualcosa else Se l'espressione è falsa, eseguo altri comandi o visualizzo qualcosa fi
Il costrutto di un IF annidato invece viene fatto in questo modo:
if [ espressione ]; then Se l'espressione è vera, eseguo dei comandi o visualizzo qualcosa elif [ espressione ]; then Se la prima espressione è falsa, faccio un ulteriore controllo. Se il secondo controllo risulta vero, eseguo dei comani o visualizzo qualcosa. else Se tutto è falso, eseguo dei comandi o visualizzo qualcosa. fi
Come potete vedere i costrutti sono molto simili, ma con l’annidamento permette di effettuare N controlli. Dipende sempre da quanti IF annidati ci sono, ma questo dipende da ciò che voi state scrivendo
. Ma vediamo di fare qualche piccolo esempio:
#!/bin/bash
echo "Dammi un numero: "
read primo
echo "Dammi un secondo numero: "
read secondo
if [ $primo -gt $secondo ]; then
if [ $(expr $primo % 2 ) -eq 0 ]; then
echo "Il primo numero è pari."
echo "Il primo numero è più grande del secondo."
else
echo "Il primo numero è dispari."
echo "Il primo numero continua ad essere più grande del secondo."
fi
elif [ $(expr $secondo % 2) -eq 0 ]; then
echo "Il secondo numero è pari."
echo "Il secondo numero è più grande del primo."
else
echo "Il secondo numero è dispari."
echo "Il secondo numero è più grande del primo."
fi
Come potete vedere dall’esempio ho utilizzato un costrutto di IF annidati. Può sembrare un casino ma non è così.
Ora vi spiego meglio che cosa fa tutto questo pezzo di codice. Lo script ci chiede due numeri dati da tastiera. Controlla se il primo numero è più grande del secondo. Se questa espressione risulta vera, allora controlla se il numero è pari. Un numero è pari quando il suo resto è uguale a zero (0). Se l’espressione è uguale a zero, allora il primo numero è pari se no è dispari. Ma ipotiziamo che il primo numero è più piccolo del secondo, lo script catapulterà il controllo su Elif che controllerà se il secondo numero è pari o dispari.
Su questo esempio però c’è un problema perché se i numeri inseriti da tastiera sono uguali, l’espressione del primo IF risulterebbe FALSA e quindi dovremmo mettere un secondo controllo. Ecco qui la versione modificata per prevenire questo tipo di errore:
#!/bin/bash
echo "Dammi un numero: "
read primo
echo "Dammi un secondo numero: "
read secondo
if [ $primo -gt $secondo ]; then
if [ $(expr $primo % 2 ) -eq 0 ]; then
echo "Il primo numero è pari."
echo "Il primo numero è più grande del secondo."
else
echo "Il primo numero è dispari."
echo "Il primo numero continua ad essere più grande del secondo."
fi
elif [ $primo -eq $secondo ]; then
echo "I numeri sono uguali."
if [ $(expr $primo % 2) -eq 0 ]; then
echo "Il primo numero è pari."
echo "Il secondo numero è pari."
else
echo "Il primo numero è dispari."
echo "Il secondo numero è dispari."
fi
elif [ $(expr $secondo % 2) -eq 0 ]; then
echo "Il secondo numero è pari."
echo "Il secondo numero è più grande del primo."
else
echo "Il secondo numero è dispari."
echo "Il secondo numero è più grande del primo."
fi
Provate questi script per vedere meglio come funzionano. Creare IF annidati è molto semplice purtroppo è difficile scriverli leggibili agli altri programmatori
. Prima di chiudere il post do un piccolo consiglio per generare dei numeri casuali su Bash. Per generarli utilizzeremo la variabile $RANDOM. Il suo utilizzo è molto semplice, ecco qui :
casuale=$((RANDOM%10))
All’interno della variabile $casuale verrano generati dei numeri casuali che vanno da 0 a 9. In informatica il contatore parte sempre da 0. Se volete farlo partire da 1allora dovete scrivere così:
casuale=$((RANDOM%10+1))
Bene possiamo chiudere questo post con un piccolo gioco da fare a casa. Create il classico gioco “Carta – Forbice – Sasso”. Lo script vi chiederà di inserire da tastiera un numero, 2 = Forbice, 5 = Carta e 0 = Sasso. Il computer a sua volta sceglierà un suo numero per cercare di battervi. Vi ricordo le regole del gioco:
- Carta batte Sasso
- Sasso batte Forbice
- Forbice batte Carta
Buona fortuna
. Spero tanto di trovare qualche commento sulla soluzione del gioco.
Ps.: Ecco la descrizione del gioco su Wikipedia -> http://it.wikipedia.org/wiki/Morra_cinese
Io e Bit3Lux






Pingback: Frattanto nella blogosfera #29 « Ok, panico
Pingback: toshidex ~# » Blog Archive » [ Bash ] Morra Cinese aka Carta, Forbice e Sasso.
Pingback: toshidex ~# » Blog Archive » Progetto Bash. Istruzioni condizionali: Case