Bash: double equals vs -eq (Italiano)

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

  • Tieni presente che gli spazi tra parentesi sono obbligatori: [ $UID -eq 0 ], non [ $UID -eq 0].

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 a bash di interpretare le stringhe come numeri interi (producendo 0 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 (una ksh funzionalità supportata anche da bash e zsh con varianti).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *