Il seguente codice dà
[: -ge: previsto operatore unario
quando
i=0
if [ $i -ge 2 ]
then
#some code
fi
perché?
Il seguente codice dà
[: -ge: previsto operatore unario
quando
i=0
if [ $i -ge 2 ]
then
#some code
fi
perché?
Risposte:
Il tuo problema deriva dal fatto che $i
ha un valore vuoto quando la tua dichiarazione fallisce. Cita sempre le tue variabili quando esegui i confronti se c'è la minima possibilità che una di esse possa essere vuota, ad esempio:
if [ "$i" -ge 2 ] ; then
...
fi
Ciò è dovuto al modo in cui la shell tratta le variabili. Supponiamo l'esempio originale,
if [ $i -ge 2 ] ; then ...
La prima cosa che fa la shell quando si esegue quella particolare riga di codice è sostituire il valore di $i
, proprio come farebbe la funzione di ricerca e sostituzione dell'editor preferito . Quindi supponiamo che $i
sia vuoto o, ancora più illustrativo, supponiamo che $i
sia un mucchio di spazi! La shell sostituirà $i
come segue:
if [ -ge 2 ] ; then ...
Ora che vengono fatte le sostituzioni variabili, la shell procede con il confronto e ... fallisce perché non riesce a vedere nulla di intelligibile alla sinistra di -gt
. Tuttavia, citando $i
:
if [ "$i" -ge 2 ] ; then ...
diventa:
if [ " " -ge 2 ] ; then ...
La shell ora vede le doppie virgolette e sa che in realtà stai confrontando quattro spazi vuoti con 2 e salterà il if
.
Hai anche la possibilità di specificare un valore predefinito per $i
if $i
è vuoto, come segue:
if [ "${i:-0}" -ge 2 ] ; then ...
Questo sostituirà il valore 0 invece $i
si $i
è indefinito. Continuo a mantenere le virgolette perché, ancora una volta, se $i
è un gruppo di spazi vuoti, non viene considerato indefinito , non verrà sostituito con 0 e si verificherà nuovamente il problema.
Si prega di leggere questo quando hai tempo. La shell è trattata come una scatola nera da molti, ma funziona con pochissime e molto semplici regole - una volta che sei consapevole di quali sono queste regole (una delle quali è come funzionano le variabili nella shell, come spiegato sopra) la shell non hai più segreti per te.
Devo aggiungere i miei 5 centesimi. Vedo che tutti usano [
o [[
, ma vale la pena ricordare che non fanno parte della sintassi if.
Per confronti aritmetici, utilizzare ((...))
invece.
((...)) è un comando aritmetico, che restituisce uno stato di uscita pari a 0 se l'espressione è diversa da zero o 1 se l'espressione è zero. Utilizzato anche come sinonimo di "let", se sono necessari effetti collaterali (incarichi).
Vedi: ArithmeticExpression
Il tuo pezzo di sceneggiatura funziona alla grande. Sei sicuro di non assegnare nient'altro prima dell'if a "i"?
Un errore comune è anche quello di non lasciare uno spazio dopo e prima delle parentesi quadre.