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,
-eqmówibash, aby interpretować ciągi jako liczby całkowite (generując0bez 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; fibash: [: 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ż010bę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),exprma takie operatory, choć zrobi to ar Porównanie itmetyczne, jeśli argumenty są rozpoznawane jako liczby (expr 01 '>=' 1zwraca prawdę,expr X01 '>=' X1zwraca 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 (funkcjakshobsługiwana również przezbashizshz odmianami).
[ $UID -eq 0 ], a nie[ $UID -eq 0].