Sto facendo un confronto di numeri interi in bash (cercando di vedere se lutente è in esecuzione come root) e ho trovato due diversi modi per farlo:
Doppio uguale:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Capisco che “s no> = o < = in bash, solo -ge e -le, quindi perché cè un ==
se “sa -eq
?
Cè una differenza nel modo in cui confronta entrambi i lati?
Commenti
Risposta
==
è un bash
-specific alias per =
, che esegue un confronto di stringhe (lessicale) invece del -eq
confronto numerico. (È al contrario di Perl: gli operatori in stile parola sono numerici, quelli simbolici lessicali.)
Commenti
- Significa che se entrambi i lati sono numeri interi, converte entrambi i lati in stringhe e poi li confronta?
- Più precisamente ' è il contrario: tutto è una stringa,
-eq
dice abash
di interpretare le stringhe come numeri interi (producendo0
senza un avviso se una stringa non è ' t numerico). - @tjameson Per fare un esempio:
[ 01 -eq 1 ]
ma[ 01 != 1 ]
. - Tieni presente che mentre
==
come operatore[
non è standard e dovrebbe non essere utilizzato, non è specifico per bash . È stato introdotto da ksh ed è supportato anche da zsh (anche se il primo=
deve essere citato) , yash e lutilità GNU[
( e qualsiasi utilità di questo tipo implementata come script ksh su alcuni sistemi) almeno). - @geekosaur ricevo un avviso da bash v4.3.42 se la mia stringa non è ' t numerico:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: ciao: espressione intera attesa
Risposta
Per elaborare la risposta di bollovan …
Non cè >=
o <=
operatore di confronto per le stringhe. Ma potresti usarli con il comando aritmetico ((...))
per confrontare gli interi.
Puoi anche utilizzare gli altri operatori di confronto tra stringhe (==
, !=
, <
, >
, ma non =
) per confrontare numeri interi se li utilizzi allinterno di ((...))
.
Esempi
- Sia
[[ 01 -eq 1 ]]
e(( 01 == 1 ))
fanno numero intero confronti. Entrambi sono veri. - Entrambi
[[ 01 == 1 ]]
e[ 01 = 1 ]
eseguono confronti tra stringhe. Entrambi sono falsi. - Entrambi
(( 01 -eq 1 ))
e(( 01 = 1 ))
restituiranno un errore.
Nota: la sintassi delle doppie parentesi [[...]]
e la sintassi delle doppie parentesi ((...))
non sono supportate da tutte le shell.
Commenti
- Tieni presente che (ad eccezione di
mksh
/zsh
(tranne in modalità POSIX (sebbene ' non sia una funzione POSIX))),(( 010 == 10 ))
restituirebbe false perché010
verrebbe trattato come un numero ottale (8 in decimale). - Tieni presente che mentre la maggior parte di
test
/[
implementazioni don ' t avere>=
/<=
operatori (yash
' s[
ha però),expr
ha tali operatori, anche se farà ar Confronto itmetico se gli argomenti sono riconosciuti come numeri (expr 01 '>=' 1
restituisce true,expr X01 '>=' X1
restituisce false).
Risposta
Se vuoi fare un confronto di numeri interi, è meglio usare (()), dove puoi anche usare> = ecc.
Esempio:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Commenti
- Oppure
(( UID == 0 ))
o(( ! UID ))
per questo. Tieni presente che((...))
non è standard (unaksh
funzionalità supportata anche dabash
ezsh
con varianti).
[ $UID -eq 0 ]
, non[ $UID -eq 0]
.