Robię porównanie liczb całkowitych w bashu (próbuję sprawdzić, czy użytkownik działa jako root) i znalazłem dwa różne sposoby zrobienia tego:
Podwójne równa się:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Rozumiem, że w bash jest „no> = lub < =, tylko -ge i -le, więc dlaczego jest ==
jeśli istnieje „sa -eq
?
Czy jest różnica w sposobie porównania obu stron?
Komentarze
Odpowiedź
==
to bash
-specyficzny alias dla =
, który wykonuje porównanie łańcuchowe (leksykalne) zamiast -eq
porównania liczbowego. (Jest wstecz od Perla: operatory w stylu słów są numeryczne, a symboliczne – leksykalne).
Komentarze
- Czy to oznacza, że jeśli obie strony są liczbami całkowitymi, konwertuje obie strony na ciągi, a następnie porównuje je?
- Dokładniej ' Czy na odwrót: wszystko jest ciągiem,
-eq
mówibash
, aby interpretować ciągi jako liczby całkowite (generując0
bez ostrzeżenia, jeśli ciąg isn ' t numeric). - @tjameson Aby podać przykład:
[ 01 -eq 1 ]
ale[ 01 != 1 ]
. - Pamiętaj, że operator
==
jako[
jest niestandardowy i powinien nie może być używany, nie jest specyficzny dla bash . Został wprowadzony przez ksh i jest również obsługiwany przez zsh (chociaż pierwsze=
musi być cytowane) , yash i narzędzie GNU[
( i wszelkie takie narzędzia zaimplementowane jako skrypty ksh w niektórych systemach) przynajmniej). - @geekosaur Otrzymuję ostrzeżenie z bash v4.3.42, jeśli mój ciąg nie jest ' t numeric:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: oczekiwano wyrażenia integer
Odpowiedź
Aby rozwinąć odpowiedź bollovan …
Nie ma >=
lub <=
operator porównania dla ciągów. Ale możesz ich użyć z ((...))
poleceniem arytmetycznym do porównywania liczb całkowitych.
Możesz także użyć innych operatorów porównywania ciągów (==
, !=
, <
, >
, ale nie =
) do porównywania liczb całkowitych, jeśli używasz ich w ((...))
.
Przykłady
- Zarówno
[[ 01 -eq 1 ]]
, jak i(( 01 == 1 ))
robią liczbę całkowitą porównania. Obie wartości są prawdziwe. - Zarówno
[[ 01 == 1 ]]
, jak i[ 01 = 1 ]
dokonują porównań ciągów. Obie są fałszywe. - Zarówno
(( 01 -eq 1 ))
, jak i(( 01 = 1 ))
zwrócą błąd.
Uwaga: składnia podwójnego nawiasu [[...]]
i składnia podwójnych nawiasów ((...))
nie są obsługiwane przez wszystkie powłoki.
Komentarze
- Pamiętaj, że (z wyjątkiem
mksh
/zsh
(z wyjątkiem w trybie POSIX (chociaż ' nie jest funkcją POSIX))),(( 010 == 10 ))
zwróciło fałsz, ponieważ010
będzie traktowane jako liczba ósemkowa (8 w systemie dziesiętnym). - Pamiętaj, że większość
test
/[
implementacje nie ' nie mają operatorów>=
/<=
(yash
' s[
ma),expr
ma takie operatory, choć zrobi to ar Porównanie itmetyczne, jeśli argumenty są rozpoznawane jako liczby (expr 01 '>=' 1
zwraca prawdę,expr X01 '>=' X1
zwraca fałsz).
Odpowiedź
Jeśli chcesz porównać liczby całkowite, lepiej użyj (()), gdzie możesz również użyć> = itd.
Przykład:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Komentarze
- Lub
(( UID == 0 ))
lub(( ! UID ))
w tym przypadku. Pamiętaj, że((...))
jest niestandardowy (funkcjaksh
obsługiwana również przezbash
izsh
z odmianami).
[ $UID -eq 0 ]
, a nie[ $UID -eq 0]
.