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,
-eqdice abashdi interpretare le stringhe come numeri interi (producendo0senza 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; fibash: [: 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é010verrebbe 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ò),exprha tali operatori, anche se farà ar Confronto itmetico se gli argomenti sono riconosciuti come numeri (expr 01 '>=' 1restituisce true,expr X01 '>=' X1restituisce 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 (unakshfunzionalità supportata anche dabashezshcon varianti).
[ $UID -eq 0 ], non[ $UID -eq 0].