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á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že010
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í (funkceksh
podporovaná takébash
azsh
s variacemi).
[ $UID -eq 0 ]
, ne[ $UID -eq 0]
.