| 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   |