<Precedenti | Contenuti | Succ.>
Espansioni impreviste
È possibile avere errori che si verificano solo in modo intermittente in uno script. A volte lo script funzionerà correttamente e altre volte fallirà a causa dei risultati di un'espansione. Se restituiamo il punto e virgola mancante e cambiamo il valore di numero a una variabile vuota, noi
può dimostrare:
#! / Bin / bash
# problema: script per dimostrare errori comuni
numero=
if [ $numero = 1 ]; poi
echo "Il numero è uguale a 1." altro
echo "Il numero non è uguale a 1."
fi
#! / Bin / bash
# problema: script per dimostrare errori comuni
numero=
if [ $numero = 1 ]; poi
echo "Il numero è uguale a 1." altro
echo "Il numero non è uguale a 1."
fi
L'esecuzione dello script con questa modifica produce l'output:
[io@linuxbox~]$ guaio
/home/me/bin/trouble: riga 7: [: =: operatore unario previsto Il numero non è uguale a 1.
[io@linuxbox~]$ guaio
/home/me/bin/trouble: riga 7: [: =: operatore unario previsto Il numero non è uguale a 1.
Otteniamo questo messaggio di errore piuttosto criptico, seguito dall'output del secondo eco comando. Il problema è l'espansione del numero variabile all'interno del test comando. Quando il comando:
[ $numero = 1 ]
[ $numero = 1 ]
subisce espansione con numero essendo vuoto, il risultato è questo:
[=1]
[=1]
che non è valido e viene generato l'errore. Il = operatore è un operatore binario (richiede un valore su ciascun lato), ma manca il primo valore, quindi test comando si aspetta un operatore unario (come -z) Invece. Inoltre, poiché test fallito (a causa dell'errore), il if comando riceve un codice di uscita diverso da zero e agisce di conseguenza, e il secondo eco comando viene eseguito.
Questo problema può essere corretto aggiungendo virgolette attorno al primo argomento nel test
comando:
[ "$numero" = 1 ]
[ "$numero" = 1 ]
Quindi quando si verifica l'espansione, il risultato sarà questo:
[ "" = 1 ]
[ "" = 1 ]
che fornisce il numero corretto di argomenti. Oltre alle stringhe vuote, le virgolette dovrebbero essere utilizzate nei casi in cui un valore potrebbe espandersi in stringhe di più parole, come con i nomi di file contenenti spazi incorporati.