Bash: double equals vs -eq (Polski)

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

  • Pamiętaj, że spacje w nawiasach kwadratowych są wymagane: [ $UID -eq 0 ], a nie [ $UID -eq 0].

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ówi bash, aby interpretować ciągi jako liczby całkowite (generując 0 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 (funkcja ksh obsługiwana również przez bash i zsh z odmianami).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *