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
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ábashinterpretovat řetězce jako celá čísla (vytváření0bez 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; fibash: [: 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že010bude 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),exprmá takové operátory, i když to bude dělat ar ithmetické srovnání, pokud jsou argumenty rozpoznány jako čísla (expr 01 '>=' 1vrátí hodnotu true,expr X01 '>=' X1vrá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í (funkcekshpodporovaná takébashazshs variacemi).
[ $UID -eq 0 ], ne[ $UID -eq 0].