Operandy porównań liczbowych -eq
, -gt
, -lt
, -ge
, -le
i -ne
są traktowane jako wyrażeń arytmetycznych. Z pewnymi ograniczeniami nadal muszą być słowami pojedynczymi.
Zachowanie nazw zmiennych w wyrażeniach arytmetycznych opisano w Shell Arithmetic :
Zmienne powłoki są dozwolone jako operandy; interpretacja parametru jest wykonywana przed obliczeniem wyrażenia. W wyrażeniu zmienne powłoki mogą być również przywoływane według nazwy bez użycia składni rozszerzania parametrów. Zmienna powłoki, która jest zerowa lub nieustawiona, przyjmuje wartość 0, gdy odwołuje się do niej nazwa bez użycia składni interpretacji parametrów.
i również:
Wartość zmiennej jest oceniana jako wyrażenie arytmetyczne, gdy się do niej odwołuje
Ale tak naprawdę nie mogę znaleźć części dokumentacji, w której jest powiedziane, że porównania numeryczne przyjmują wyrażenia arytmetyczne. Nie jest to opisane w Konstrukcjach warunkowych pod [[
, ani nie jest opisane w Wyrażeniach warunkowych Bash .
Ale eksperymentalnie wydaje się, że działa jak wspomniano powyżej.
Więc takie rzeczy działają:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
to też (wartość zmiennej jest oceniana):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Ale tak nie jest; nie jest to pojedyncze słowo powłoki podczas [[ .. ]]
analizowania, więc występuje błąd składniowy w warunkowym:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
W innych kontekstach arytmetycznych wyrażenie nie musi być spacją. Wypisuje się 999
, gdy nawiasy jednoznacznie ograniczają wyrażenie arytmetyczne w indeksie:
a[6]=999; echo ${a[1 + 2 + 3]}
Z drugiej strony =
porównanie jest dopasowaniem wzorca i nie obejmuje arytmetyki, ani automatycznego rozszerzania zmiennych wykonywanego w kontekście arytmetycznym (konstrukcje warunkowe):
Gdy używane są operatory ==
i !=
, ciąg po prawej stronie operatora jest uważany za wzorzec i dopasowywany zgodnie z zasadami opisanymi poniżej w Dopasowywanie wzorców, tak jakby opcja powłoki extglob była włączona. =
Operator jest identyczna ==
.
Jest to więc fałsz, ponieważ ciągi znaków są oczywiście różne:
[[ "1 + 2 + 3" = 6 ]]
jak to jest, mimo że wartości liczbowe są takie same:
[[ 6 = 06 ]]
i tutaj również porównywane są ciągi ( x
i 6
), są one różne:
x=6
[[ x = 6 ]]
Spowoduje to jednak rozwinięcie zmiennej, więc jest to prawdą:
x=6
[[ $x = 6 ]]
x=1
następnie[[ x -gt 2]]
?