mercoledì 6 luglio 2011

Progetto Bash. Istruzioni condizionali: IF - AND & OR

Salve! :)

Eccoci alla seconda parte teorica afferente all'IF.

l'IF è uno degli argomenti più importanti del progetto bash. Progetto portato avanti da me e dal caro Lightuono nonostante la calura estiva. Comunque la difficoltà maggiore consiste nel tradurre in parole semplici un linguaggio che di per sè facile non è. Mi spiego meglio. I concetti sono semplici, la difficoltà vera è costituita dalla sintassi. Perciò se qualcosa non vi è chiara, non esitate a farlo presente nei commenti (sul mio blog o su quello di Light). Iniziamo col post di oggi :D

Se aprite un terminale e digitate

man test

vi troverete davanti tutta una serie di operatori logici. E questo lo sappiamo già! Ricordate? Non solo, molti di questi li conosciamo già e sappiamo come si usano!

Bene! Oggi  parleremo di due operatori logici coi baffi :D, cioè di Or e And

Ecco, nel man test, cosa si trova scritto sul loro conto

EXPRESSION1 -a EXPRESSION2
              both EXPRESSION1 and EXPRESSION2 are true

EXPRESSION1 -o EXPRESSION2
              either EXPRESSION1 or EXPRESSION2 is true


Cosa significa?

Dovete sapere che con l'If è possibile collegare due espressioni. Lo so, detto così non si capisce un tubo.

Proviamo ad andare avanti facendo esempi.

Prima però un pò di teoria la devo pur scrivere! La parte che curo io si chiama appunto Parte teorica...

Dicevo che con L'If è possibile collegare due espressioni che fanno cose diverse; Il risultato di ciascuna (espressione) può essere

vero (true) o falso (false)

 Facciamo immediatamente un esempio

prima espressione: if [$a -eq 5 ]......

seconda espressione: if [ $b -lt 3]......

La prima espressione ci dovrà dire se la variabile $a è uguale a 5. Se è uguale a 5, verrà eseguito il comando dopo il then; se non è uguale a cinque, si passerà all'else! Ci siamo fin qui! Se non ci siamo dovete leggervi la prima parte teorica Sull'IF (qui). Altrimenti è inutile andare avanti.

La seconda espressione ci dovrà dire se la variabile $b è minore di tre. Se è minore, verrà eseguito il comando dopo il then, se non è minore, il comando dopo l'else.

Passiamo all'And e Or

Questi due operatori logici hanno il compito di collegare queste due espressioni che abbiamo visto sopra; avremo allora

if [ $a -eq 5 -o $c -lt 3 ]; then #or

if [ $a -eq 5 -a $c -lt 3 ]; then #and

Ci siamo fin qui? Non è affatto difficile!

Concentriamoci ora su "OR"

Cosa fa questo benedetto OR?
Collega le due espressioni. Non solo! Se entrambi le espressioni sono vere ovvero se è vera solo una, esegue il comando dopo il then; se, invece, sono entrambi false, esegue il comando dopo l'else.

Dunque

if [ $a -eq 5 -o $c -lt 3 ]

Analizzando nei dettagli l'espressione di cui sopra:

  • se la variabile $a è uguale a 5 e la variabile $c è minore di tre (oppure se solo una delle due espressioni è vera), esegue il comando dopo il then,
  • altrimenti (cioè se entrambi le espressioni sono false), esegue il comando dopo l'else. 
Facile, no?
Scriviamo uno script (ormai sapete come renderlo eseguibile e lanciarlo, perciò non mi dilungo su queste cose)

#!/bin/bash

a=5
c=2

if [ $a -eq 5 -o $c -lt 3 ]; then
 echo "$a è uguale a 5"
 echo "$c è minore di 3"
else
 echo "$a non è uguale a 5"
 echo "$c non è minore di 3"
fi
exit 0

Chiaro? Studiatelo per bene!

Passiamo all'operatore logico "And"

Il discorso è analogo a quello che abbiamo fatto per "Or" con una differenza sostanziale però: tutte e due le espressioni devono essere vere, se non è così, esegue i comandi dopo l'else e non dopo il then.

Detto in altri termini e restando all'esempio fatto sopra:

  • se la variabile $a è uguale a 5 e la variabile $c è minore di tre, viene eseguito il comando dopo il then;
  • basta che solo la prima è falsa (o anche solo la seconda) che passa al comando else. Chiaro?
Costruiamo uno script

#!/bin/bash
a=5
c=2

if [ $a -eq 5 -a $c -lt 3 ]; then
 echo "$a è uguale a 5"
 echo "$c è minore di 3"
else
 echo "$a non è uguale a 5"
 echo "$c non è minore di 3"
fi
exit 0

Ripeto,

in questo caso entrambi le espressioni DEVONO ESSERE VERE

se già la prima espressione risulta falsa (cioè se $a non è uguale a 5), lo script passerà direttamente all'ELSE

la stessa cosa vale se è falsa solo seconda espressione;

dunque,

basta che una delle due espressioni è falsa, che per IF è tutto falso. Chiaro?

Ora Spiegheremo il perchè OR e AND si comportano in maniera così diversa!

Ecco svelato il dilemma:

premesso che

1 è true 0 è false

OR fa la somma dei valori

(in binario)

1 + 1 = 1 Prima espressione vera, seconda espressione vera, comandi dopo il then
1 + 0 = 1 prima espressione vera, seconda espressione falsa, comandi dopo il then
0 + 1 = 1 prima espressione falsa, seconda espressione vera, comandi dopo il then
0 + 0 = 0 se entrambi le espressioni sono false, comandi dopo l'else


mentre AND fa la moltiplicazione

1 * 1 = 1 entrambi le espressiono vere, comandi dopo il then
1 * 0 = 0 prima espressione vera, seconda falsa: Comandi dopo l'else
0 * 1 = 0 prima espressione falsa, seconda vera: Comandi dopo l'else
0 * 0 = 0 entrambi le espressioni false, comandi dopo l'else

Chiaro? La prossima volta parleremo della doppia parentesi quadra. :D


PS1: non dimenticatevi di consultare l'indice (qui)
PS2: leggete gli approfondimenti della parte pratica curata splendidamente dal caro Lightuono (qui)
PS3: Se avete problemi di qualsiasi genere (ovviamente legati ai post), fatevi sentire
PS4: Da me fa un caldo cane :(
PS5: se si capisce l'IF, siamo a cavallo.

Io e Lightuono

2 commenti:

  1. È il momento di fare una pausa!
    Scarica questo mio piccolo scipt dalla pagina:
    http://www.ubaweb.it/bischerate/index.php?p=1
    È un esercizio con sleep di bash, uno spunto da sviluppare.
    Fammi sapere se hai qualche suggerimento.
    Ciao 8-)

    RispondiElimina