Confronta numero intero in bash, atteso operatore unario


137

Il seguente codice dà

[: -ge: previsto operatore unario

quando

i=0

if [ $i -ge 2 ]
then
    #some code
fi

perché?

Risposte:


295

Il tuo problema deriva dal fatto che $iha 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 $isia vuoto o, ancora più illustrativo, supponiamo che $isia un mucchio di spazi! La shell sostituirà $icome 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 $iif $iè vuoto, come segue:

if [ "${i:-0}" -ge 2 ] ; then ...

Questo sostituirà il valore 0 invece $isi $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.


7
la quotatura della variabile genererà un nuovo errore come previsto l'espressione intera
Néstor,

@ Néstor errato , la citazione di una variabile NON genererà un nuovo errore come l' espressione intera prevista se la variabile è numerica; fornendo un valore variabile non numerico, quotate o no, si tradurrà in detto errore.
Vladr,

6

A giudicare dal messaggio di errore il valore di i era la stringa vuota quando l'hai eseguita, non 0.


6

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


2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.