Bash: doppio uguale a -eq


47

Sto facendo il confronto dei numeri interi in bash (cercando di vedere se l'utente sta eseguendo come root) e ho trovato due modi diversi di farlo:

Doppio uguale:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

Capisco che non c'è> = o <= in bash, solo -ge e -le, quindi perché c'è un ==se c'è un -eq?

C'è una differenza nel modo in cui confronta entrambe le parti?


3
Si noti che sono richiesti spazi tra parentesi:, [ $UID -eq 0 ]no [ $UID -eq 0].
Gilles 'SO- smetti di essere malvagio' il

Risposte:


51

==è un bashalias specifico per =, che esegue un confronto di stringhe (lessicale) invece del -eqconfronto numerico. (È arretrato di Perl: gli operatori in stile parola sono numerici, quelli simbolici lessicali).


Ciò significa che se entrambi i lati sono numeri interi, li converte in stringhe e poi li confronta?
beatgammit,

5
Più precisamente è il contrario: tutto è una stringa, -eqdice bashdi interpretare le stringhe come numeri interi (producendo 0senza preavviso se una stringa non è numerica).
Geekosaur,

11
@tjameson Per fare un esempio: [ 01 -eq 1 ]ma [ 01 != 1 ].
Gilles 'SO- smetti di essere malvagio' il

3
Si noti che mentre ==un [operatore non è standard e non deve essere utilizzato, non è specifico per bash . È stato introdotto da ksh ed è anche supportato da zsh (anche se il primo =deve essere citato), yash e l' [utilità GNU (e qualsiasi utilità di questo tipo implementata come script ksh su alcuni sistemi) almeno).
Stéphane Chazelas,

@geekosaur Ricevo un avviso da bash v4.3.42 se la mia stringa non è numerica: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: ciao: espressione intera prevista
Andrew Bainbridge

13

Per approfondire la risposta di bollovan ...

Non esiste un operatore di confronto >=o <=per le stringhe. Ma potresti usarli con il ((...))comando aritmetico per confrontare numeri interi.

È inoltre possibile utilizzare gli altri operatori di confronto stringa ( ==, !=, <, >, ma non =) per confrontare interi se si utilizzano all'interno ((...)).

Esempi

  • Entrambi [[ 01 -eq 1 ]]e (( 01 == 1 ))fanno confronti interi. Entrambi sono veri.
  • Entrambi [[ 01 == 1 ]]e [ 01 = 1 ]confrontano le stringhe. Entrambi sono falsi.
  • Entrambi (( 01 -eq 1 ))e (( 01 = 1 ))restituiranno un errore.

Nota: la sintassi [[...]]della doppia parentesi e la sintassi delle doppie parentesi ((...))non sono supportate da tutte le shell.


1
Si noti che (ad eccezione di mksh/ zsh(tranne in modalità POSIX (anche se non si tratta di una funzione POSIX))), (( 010 == 10 ))restituirebbe false perché 010verrebbe trattato come un numero ottale (8 in decimale).
Stéphane Chazelas,

Si noti che mentre la maggior parte test/ [le implementazioni non hanno >=/ <=operatori ( yash's [ha però), exprha tali operatori, anche se farà il confronto aritmetica se gli argomenti sono riconosciuti come numeri ( expr 01 '>=' 1restituisce TRUE, expr X01 '>=' X1restituisce falso).
Stéphane Chazelas,

7

Se vuoi fare un confronto tra numeri interi dovrai usare meglio (()), dove puoi anche usare> = ecc.

Esempio:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi

O (( UID == 0 ))o (( ! UID ))per quello che conta. Si noti che ((...))non è standard (una kshfunzionalità supportata anche da bashe zshcon variazioni).
Stéphane Chazelas,
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.