Robię porównanie liczb całkowitych w bash (próbuję sprawdzić, czy użytkownik działa jako root) i znalazłem dwa różne sposoby:
Podwójna równość:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Rozumiem, że nie ma> = lub <= w bash, tylko -ge i -le, więc dlaczego jest taki, ==
jeśli istnieje -eq
?
Czy istnieje różnica w porównaniu obu stron?
bash
shell
arithmetic
beatgammit
źródło
źródło
[ $UID -eq 0 ]
nie[ $UID -eq 0]
.Odpowiedzi:
==
jestbash
specyficznym aliasem dla=
, który wykonuje porównanie łańcuchowe (leksykalne) zamiast-eq
porównania numerycznego. (Odwrotnie od Perla: operatory tekstowe są numeryczne, a symboliczne leksykalne.)źródło
-eq
mówi,bash
aby interpretować ciągi jako liczby całkowite (produkuje0
bez ostrzeżenia, jeśli ciąg nie jest liczbowy).[ 01 -eq 1 ]
ale[ 01 != 1 ]
.==
jako[
operatora nie jest standardowa i nie powinny być stosowane, nie atakujących specyficzne . Został on wprowadzony przez ksh i jest również obsługiwany przez zsh (choć pierwsze=
trzeba zacytować), yash i[
narzędzie GNU (i wszelkie takie narzędzia zaimplementowane jako skrypty ksh w niektórych systemach).$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: oczekiwane wyrażenie całkowiteAby rozwinąć odpowiedź Bollovana ...
Nie ma operatora
>=
lub<=
operatora porównania dla ciągów. Ale możesz użyć ich z((...))
poleceniem arytmetycznym do porównania liczb całkowitych.Można również korzystać z innych operatorów porównania string (
==
,!=
,<
,>
, ale nie=
), aby porównać liczby całkowite, jeśli ich używać wewnątrz((...))
.Przykłady
[[ 01 -eq 1 ]]
i(( 01 == 1 ))
porównuj liczby całkowite. Oba są prawdziwe.[[ 01 == 1 ]]
i[ 01 = 1 ]
robić porównań ciągów. Oba są fałszywe.(( 01 -eq 1 ))
i(( 01 = 1 ))
zwróci błąd.Uwaga: Składnia
[[...]]
podwójnego nawiasu i składnia podwójnego nawiasu((...))
nie są obsługiwane przez wszystkie powłoki.źródło
mksh
/zsh
(z wyjątkiem trybu POSIX (choć nie jest to funkcja POSIX)))(( 010 == 10 ))
zwróci false, ponieważ010
będzie traktowany jako liczba ósemkowa (8 w systemie dziesiętnym).test
/[
implementacje nie mają>=
/<=
operatorzy (yash
„s[
ma jednak),expr
ma takich operatorów, choć będzie to zrobić arytmetycznego porównania jeśli argumenty są rozpoznawane jako cyfry (expr 01 '>=' 1
zwraca True,expr X01 '>=' X1
zwraca false).Jeśli chcesz wykonać porównanie liczb całkowitych, lepiej użyj (()), gdzie możesz także użyć> = itd.
Przykład:
źródło
(( UID == 0 ))
czy(( ! UID ))
dla tej kwestii. Pamiętaj, że((...))
jest to niestandardowe (ksh
funkcja obsługiwana również przezbash
izsh
z odmianami).