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
Ottimo, ti sei dimenticato solo di dire che bisogna rendere eseguibili i file contenenti gli script.
RispondiEliminaGrazie, ogni tanto perdo qualche pezzo :)
RispondiEliminaCiao, 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.
RispondiEliminaHai fatto bene a dirmelo! Ho corretto. :))
Eliminasalve
RispondiEliminasto 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
grazie
RispondiElimina