mercoledì 29 giugno 2011

Progetto Bash. Istruzioni condizionali: IF - Introduzione

In questo primo post sull'IF, cerco di dire le cose essenziali. Prossimamente ci soffermeremo su ogni singolo aspetto.

In estrema sintesi, L'IF "ragiona" in questi termini:

SE una determinata condizione è vera

     fai questo

ALTRIMENTI

     fai quest'altro

esempio

Se la variabile A è uguale alla variabile B

           dici che A è uguale a B


Altrimenti

           dici che A è diversa da B


Ora traduciamo questo esempio nella sintassi bash


#!/bin/bash

a=5
b=4

if [ $a -eq $b ]; then
          
          echo "buongiorno"
else
          echo "buonasera"
       
fi

exit 0

Ma non corriamo troppo. Fermiamoci e prendiamo un pò di fiato.

Analizziamo [ $a -eq $b ].

[] è un comando di verifica.

$a e $b sono le due variabili da confrontare

-eq è l'operatore di confronto (che significa "uguale")

la prima riga dell'IF possiamo scriverla in due modi

1. if [ $a -eq $b ]
   then

2. if [ $a -eq $b ]; then

Questo per dire che quando if e then sono sulla stessa riga occorre mettere un punto e virgola subito dopo il comando di verifica (o enunciato if)

Passiamo alle restanti righe dello script. Se la la condizione (prima riga) è vera, cioè se la variabile "a" è uguale alla variabile "b" allora verranno  eseguiti i comandi dopo il then: nel nostro caso ci verrà detto "buongiorno"

 Se invece la condizione non è vera (restando all'esempio, non è vera; infatti 5 non è uguale a 4) allora verranno eseguiti i comandi dopo l'else: nel nostro caso ci verrà detto "buonasera"

Dunque
se la condizione è vera (a=b), ci verrà detto "buongiorno"
se la condizione non è vera, "buonasera"


Non è tutto!

Ma "else" è indispensabile?

Assolutamente no. Il costrutto si può fermare benissimamente al comando dopo il then. Dunque l'else è meramente facoltativo, nel senso che lo si può omettere senza che venga meno il controllo che vogliamo effettuare. In tal caso se la condizione non è vera, si esce dallo script senza che venga eseguito alcun comando.

In altri termini, se "a" è uguale a "b" ci verrà detto "buongiorno". Se "a" è diverso da "b" non ci verrà detto nulla. Chiaro!!!

per il momento ci limitiamo al confronto tra due variabili; come sappiamo ne esistono di due tipi

1. Variabili intere
2. Variabili stringhe

Questa differenza è essenziale. E ora capirete il perchè!

Il confronto tra le due variabili avviene per mezzo di un operatore di controllo; e gli operatori di controllo si scrivono in maniera diversa a seconda che si tratta di variabile intera o variabile stringa. Nessuna paura! Ora scendiamo, per quanto possibile, nei particolari.

Iniziamo dagli operatori di confronti tra variabili intere

abbiamo già visto -eq che sta per uguale: se "a" è uguale a "b" allora esegui il/i comandi dopo il "then" altrimenti esegui i comandi dopo "else"

Vediamone altri:


-ne: se "a" non è uguale a "b" allora....altrimenti....
La sintassi è la seguente: if [ $a -ne $b ]
  
  
-gt: se "a" è maggiore di "b" allora....altrimenti......
La sintassi è la seguente: if [ $a -gt $b ]
 
  
-ge:  se "a" è maggiore o uguale a "b" allora.....altrimenti....
La sintassi è if [ $a -ge $b ]
 
  
-lt: se "a" è minore di "b" allora......altrimenti......
La sintassi è if [ $a -lt $b ]
 
  
-le: se "a" è minore o uguale a "b" allora.....altrimenti....
La sintassi è if [ $a -le $b ]
 
  
facciamo un esempio con l'operatore -ne (diverso, non uguale).

Scriviamo uno script;

#!/bin/bash

a=5
b=6

if [ $a -ne $b ]; then

        echo "voglio vivere in montagna"

else
        echo "voglio vivere al mare"

fi

exit 0

Dopo aver salvato lo script (sulla scrivania), resolo eseguibile e nominato, ad es., ff.sh

spostiamoci sulla scrivania con cd Scrivania ed eseguiamo lo script

$./ff.sh

L'output sarà il seguente:

voglio vivere in montagna. Perchè?

Vi consiglio vivamente di esercitarvi con tutti gli altri operatori. Se volete potete postare nei commenti i vostri esercizi :D

Restando al confronto tra interi, il confronto può avvenire anche tra una variabile intera e un numero intero

esempio

#!/bin/bash

a=300

if [ $a -lt 200 ]; then

           echo "ho vinto"
else
           echo "ho perso"
fi

exit 0

L'output sarà

ho perso. Perchè?

Esercitatevi! Esercitatevi!

Passiamo al confronto tra stringhe

Gli operatori di confronto in questione (ma solo quelli più importanti) sono

"==" se "$nome1" è uguale a "nome2" allora esegui il/i comandi dopo il "then" altrimenti esegui i comandi dopo "else"; La sintassi è la seguente:
if [ "$nome1" == "$nome2" ]

"!=" se "$nome1" è diverso di "nome2" allora esegui il/i comandi dopo il "then" altrimenti esegui i comandi dopo "else"; La sintassi è la seguente:  
if [ "$nome1" != "$nome2" ]

Costruiamo uno script di esempio

#!/bin/bash

nome1="marco"
nome2="giovanni"

if [ "$nome1" == "$nome2" ]; then
            
              echo "come stai?"
else
              echo "oggi ti vedo male"

fi

exit 0

L'output è
oggi ti vedo male. Perchè?

Passiamo agli operatori di verifica di file (anche qui mi limito ad indicarne alcuni)

[-c FILE] Vero se FILE esiste ed è uno speciale file a caratteri.

[-e FILE] Vero se FILE esiste.
        
[-f FILE] Vero se FILE esiste ed è un file regolare.

[-h FILE] Vero se FILE esiste ed è un collegamento simbolico.

Costruiamo uno script di esempio

#!/bin/bash

A="ciao.txt"

if [ -f $A ]; then
      
    echo "Va bene"

else

    echo "Non va bene"

fi

exit 0

Provate lo script! Nominatelo come volete. :)

Se il file ciao.txt è presente sulla scrivania, allora lo script stampa "Va bene", altrimenti "Non va bene"

Facciamo un altro esempio (questa volta più carino!)

#!/bin/bash

A="ciao.txt"

if [ -f $A ]; then
      
    echo "va bene"

else

    > $(basename $A)

fi

exit 0

Lo script questa volta ragiona così: Controllo se il documento "ciao.txt" esiste ed è regolare; se esiste dico "Va bene"; Se non esiste, lo creo. :D

Provate! :D

Ultima cosa. Per vedere tutti gli operatori di confronto

man test

Alla prossima! :D




PS. Nel prossimo post: "AND e OR"; "[] e [[]]" e tante altre belle cose :D


PS1. Il caro Light, subito dopo aver finito coi parametri speciali, ci delizierà con i suoi fuochi d'artificio ovverosia con la pratica su IF

Io & Lightuono

6 commenti:

  1. Ottimo, ti sei dimenticato solo di dire che bisogna rendere eseguibili i file contenenti gli script.

    RispondiElimina
  2. Grazie, ogni tanto perdo qualche pezzo :)

    RispondiElimina
  3. Ciao, ottima guida. Solo una cosa: sul primo esempio sugli operatori di verifica dei files (ciao.txt), all'interno della parentesi quadra è stato scritto "[ $A -f ]" ed eseguendo lo script si ottiene "ciao.txt: unary operator expected" ; funziona invece lo script successivo in cui, all'interno della quadra è stato invertito l'ordine degli elementi "[ -f $A ]". Almeno questo è quanto mi sta restituendo il terminale.. tenete conto che sono un super-novello di bash, potrebbe essere che sono fuori strada.. :) Ottimo lavoro, è molto piacevole da seguire questa guida.

    RispondiElimina
    Risposte
    1. Hai fatto bene a dirmelo! Ho corretto. :))

      Elimina
  4. salve
    sto uscendo pazzo con un semplice confronto di variabili che non capisco:puoi aiutarmi? il problema è questo:
    #iizializzo variabile
    A=3
    scarico dal sito una pagina in particolare
    wget http://XXXXXXXX
    passo a grep il controllo del numero di volte che trova una parola nel file scaricato
    B=$(grep -c -i 'tatuaggi' archivio-eventi.asp)
    if [$A -eq $B];then
    echo 'trovato annuncio corso'
    else
    echo "diversa"
    fi
    Il problema è che l'esecuzione del codice mi dice che i valori sono sempre diversi ma, provando echo $B, mi da come risultato 3. Quindi l'if dovrebbe funzionare. Cosa sbaglio? Grazie

    RispondiElimina