Bash: double equals vs -eq (Čeština)

Dělám celočíselné srovnání v bash (zkouším zjistit, zda uživatel běží jako root), a našel jsem dva různé způsoby, jak to udělat:

Dvojitá rovnost:

if [ $UID == 0 ] then fi 

-eq

if [ $UID -eq 0 ] then fi 

Rozumím tomu, že existuje „no> = nebo < = v bash, pouze -ge a -le, tak proč existuje == if there „sa -eq?

Existuje rozdíl ve způsobu, jakým srovnává obě strany?

Komentáře

  • Upozorňujeme, že mezery v závorkách jsou povinné: [ $UID -eq 0 ], ne [ $UID -eq 0].

Odpověď

== je bash Specifický alias pro =, který namísto -eq numerického srovnání provede řetězcové (lexikální) srovnání. (Je to zpět z Perlu: operátory ve stylu slov jsou číselné, symbolické lexikální.)

Komentáře

  • Znamená to, že pokud obě strany jsou celá čísla, převede obě strany na řetězce a poté je porovná?
  • Přesněji to ' je to naopak: všechno je řetězec, -eq říká bash interpretovat řetězce jako celá čísla (vytváření 0 bez varování, pokud řetězec isn ' t numeric).
  • @tjameson Uvedení příkladu: [ 01 -eq 1 ] ale [ 01 != 1 ].
  • Pamatujte, že zatímco == jako [ operátor je nestandardní a měl by nelze použít, není to specifické pro bash . Bylo zavedeno ksh a je také podporováno zsh (i když je třeba uvést první =) , yash a obslužný program GNU [ ( a jakékoli takové nástroje implementované jako skripty ksh na některých systémech) alespoň).
  • @geekosaur Dostanu varování z bash v4.3.42, pokud můj řetězec není ' t numeric: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: ahoj: očekává se celočíselný výraz

odpověď

Vypracovat odpověď bollovan

Neexistuje žádný >= nebo <= operátor porovnání řetězců. Můžete je však použít s ((...)) aritmetickým příkazem k porovnání celých čísel.

Můžete také použít další operátory porovnání řetězců (==, !=, <, >, ale ne =) k porovnání celých čísel, pokud je použijete uvnitř ((...)).

Příklady

  • [[ 01 -eq 1 ]] i (( 01 == 1 )) dělat celé číslo srovnání. Oba jsou pravdivé.
  • Oba [[ 01 == 1 ]] a [ 01 = 1 ] provedou porovnání řetězců. Oba jsou nepravdivé.
  • Oba (( 01 -eq 1 )) a (( 01 = 1 )) vrátí chybu.

Poznámka: Syntaxe dvojitých závorek [[...]] a syntaxe dvojitých závorek ((...)) nejsou podporovány všemi shelly.

Komentáře

  • Pamatujte, že (kromě mksh / zsh (kromě v režimu POSIX (ačkoli to ' není funkce POSIX))), (( 010 == 10 )) vrátí false, protože 010 bude považováno za osmičkové číslo (8 v desítkové soustavě).
  • Upozorňujeme, že zatímco většina test / [ implementace nemají ' operátory >= / <= (yash ' s [ má však), expr má takové operátory, i když to bude dělat ar ithmetické srovnání, pokud jsou argumenty rozpoznány jako čísla (expr 01 '>=' 1 vrátí hodnotu true, expr X01 '>=' X1 vrátí hodnotu false).

Odpověď

Chcete-li provést celočíselné srovnání, použijte lepší (()), kde můžete také použít> = atd.

Příklad:

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

Komentáře

  • Nebo (( UID == 0 )) nebo (( ! UID )), na tom záleží. ((...)) je nestandardní (funkce ksh podporovaná také bash a zsh s variacemi).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *