Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Capitolo 7. Verifiche | Avanti |
Un operatore di verifica binario confronta due variabili o due grandezze. È da notare che i confronti fra interi utilizzano una serie di operatori diversa da quelli fra stringhe .
è uguale a
if [ "$a" -eq "$b" ]
è diverso (non uguale) da
if [ "$a" -ne "$b" ]
è maggiore di
if [ "$a" -gt "$b" ]
è maggiore di o uguale a
if [ "$a" -ge "$b" ]
è minore di
if [ "$a" -lt "$b" ]
è minore di o uguale a
if [ "$a" -le "$b" ]
è minore di (tra doppie parentesi)
(("$a" < "$b"))
è minore di o uguale a (tra doppie parentesi)
(("$a" <= "$b"))
è maggiore di (tra doppie parentesi)
(("$a" > "$b"))
è maggiore di o uguale a (tra doppie parentesi)
(("$a" >= "$b"))
è uguale a
if [ "$a" = "$b" ]
è uguale a
if [ "$a" == "$b" ]
È sinonimo di =.
Il comportamento dell'operatore di confronto == all'interno del costrutto di verifica doppie parentesi quadre è diverso rispetto a quello nel costrutto parentesi quadre singole.
|
è diverso (non uguale) da
if [ "$a" != "$b" ]
All'interno del costrutto [[ ... ]] questo operatore esegue la ricerca di corrispondenza.
è inferiore a, in ordine alfabetico ASCII
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
Si noti che "<" necessita dell'escaping nel costrutto [ ].
è maggiore di, in ordine alfabetico ASCII
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
Si noti che ">" necessita dell'escaping nel costrutto [ ].
Vedi Esempio 26-11 per un'applicazione di questo operatore di confronto.
la stringa è "nulla", cioè, ha lunghezza zero
la stringa non è "nulla".
L'operatore -n richiede assolutamente il quoting della stringa all'interno delle parentesi quadre. L'utilizzo, tra le parentesi quadre, di una stringa senza quoting, sia con ! -z che da sola (vedi Esempio 7-6), normalmente funziona, tuttavia non è una pratica sicura. Bisogna sempre utilizzare il quoting su una stringa da verificare. [1] |
Esempio 7-5. Confronti numerici e di stringhe
#!/bin/bash a=4 b=5 # Qui "a" e "b" possono essere trattate sia come interi che come stringhe. # Ci si può facilmente confondere tra i confronti numerici e quelli sulle #+ stringhe, perché le variabili Bash non sono tipizzate. # # Bash consente le operazioni di interi e il confronto di variabili #+ il cui valore è composto solamente da cifre. # Comunque attenzione, siete avvisati. echo if [ "$a" -ne "$b" ] then echo "$a non è uguale a $b" echo "(confronto numerico)" fi echo if [ "$a" != "$b" ] then echo "$a non è uguale a $b." echo "(confronto di stringhe)" # "4" != "5" # ASCII 52 != ASCII 53 fi # In questo particolare esempio funziona sia "-ne" che "!=". echo exit 0 |
Esempio 7-6. Verificare se una stringa è nulla
#!/bin/bash # str-test.sh: Verifica di stringhe nulle e di stringhe senza quoting (*) # Utilizzando if [ ... ] # Se una stringa non è stata inizializzata, non ha un valore definito. # Questo stato si dice "nullo" (non zero!). if [ -n $stringa1 ] # $stringa1 non è stata dichiarata o inizializzata. then echo "La stringa \"stringa1\" non è nulla." else echo "La stringa \"stringa1\" è nulla." fi # Risultato sbagliato. # Viene visualizzato $stringa1 come non nulla, anche se non era inizializzata. echo # Proviamo ancora. if [ -n "$stringa1" ] # Questa volta è stato applicato il quoting a $stringa1. then echo "la stringa \"stringa1\" non è nulla." else echo "La stringa \"stringa1\" è nulla." fi # Usate il quoting per le stringhe nel costrutto #+ di verifica parentesi quadre! echo if [ $stringa1 ] # Qui, $stringa1 è sola. then echo "La stringa \"stringa1\" non è nulla." else echo "La stringa \"stringa1\" è nulla." fi # Questo funziona bene. # L'operatore di verifica [ ] da solo è in grado di rilevare se la stringa #+ è nulla. # Tuttavia è buona pratica usare il quoting ("$stringa1"). # # Come ha evidenziato Stephane Chazelas, # if [ $stringa1 ] ha un argomento, "]" # if [ "$stringa1" ] ha due argomenti, la stringa vuota "$stringa1" e "]" echo stringa1=inizializzata if [ $stringa1 ] # Ancora, $stringa1 da sola. then echo "La stringa \"stringa1\" non è nulla." else echo "La stringa \"stringa1\" è nulla." fi # Ancora, risultato corretto. # Nondimeno, è meglio utilizzare il quoting ("$stringa1"), perché. . . stringa1="a = b" if [ $stringa1 ] # Ancora $stringa1 da sola. then echo "La stringa \"stringa1\" non è nulla." else echo "La stringa \"stringa1\" è nulla." fi # Senza il quoting di "$stringa1" ora si ottiene un risultato sbagliato! exit 0 # Grazie anche a Florian Wisser per la "citazione iniziale". # (*) L'intestazione di commento originaria recita "Testing null strings #+ and unquoted strings, but not strings and sealing wax, not to # mention cabbages and kings ..." attribuita a Florian Wisser. La # seconda riga non è stata tradotta in quanto, la sua traduzione # letterale, non avrebbe avuto alcun senso nel contesto attuale # (N.d.T.). |
Esempio 7-7. zmore
#!/bin/bash #zmore # Visualizza i file gzip con 'more' NOARG=65 NONTROVATO=66 NONGZIP=67 if [ $# -eq 0 ] # stesso risultato di: if [ -z "$1" ] # $1 può esserci, ma essere vuota: zmore "" arg2 arg3 then echo "Utilizzo: `basename $0` nomefile" >&2 # Messaggio d'errore allo stderr. exit $NOARG # Restituisce 65 come exit status dello script (codice d'errore). fi nomefile=$1 if [ ! -f "$nomefile" ] # Il quoting di $nomefile mantiene gli spazi. then echo "File $nomefile non trovato!" >&2 # Messaggio d'errore allo stderr. exit $NONTROVATO fi if [ ${nomefile##*.} != "gz" ] # Uso delle parentesi graffe nella sostituzione di variabile. then echo "Il file $1 non è un file gzip!" exit $NONGZIP fi zcat $1 | more # Usa il filtro 'more.' # Lo si può sostituire con 'less', se si desidera. exit $? # Lo script restituisce l'exit status della pipe. # In questo punto dello script "exit $?" è inutile perché lo script, # in ogni caso, restituirà l'exit status dell'ultimo comando eseguito. |
and logico
exp1 -a exp2 restituisce vero se entrambe exp1 e exp2 sono vere.
or logico
exp1 -o exp2 restituisce vero se è vera o exp1 o exp2.
Sono simili agli operatori di confronto Bash && e || utilizzati all'interno delle doppie parentesi quadre.
[[ condizione1 && condizione2 ]] |
if [ "$exp1" -a "$exp2" ] |
Fate riferimento ad Esempio 8-3, Esempio 26-16 e Esempio A-29 per vedere all'opera gli operatori di confronto composto.
[1] | Come sottolinea S.C., in una verifica
composta, il quoting di una variabile stringa può
non essere sufficiente.
[ -n "$stringa" -o "$a" = "$b" ]
potrebbe, con alcune versioni di Bash, provocare un errore
se |