Przeczytaj, że do porównywania napisów w środku if
musimy użyć podwójnych nawiasów kwadratowych. Niektóre książki mówią, że porównania można dokonać =
. Ale to też działa ==
.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
Czy jest jakaś różnica pomiędzy =
i ==
w porównaniu?
bash
shell-script
użytkownik3539
źródło
źródło
=
jest dla[
.==
jest dla[[
.==
, dlatego należy używać=
(równość) z[
i==
(dopasowywanie wzorców, które są ze semantyki cytując-aware) z[[
. Zobaczhelp test
vshelp [[
.[ foo == foo ] && echo foo
pewno drukujefoo
, wskazując, że==
działa z[
. Jednakże, jeśli przez „jest dla” masz na myśli, że ”miał być używany z„, to mam mniejszy sprzeciw.[[
w pierwszej kolejności, która ma znacznie bardziej zróżnicowane rozumienie tokenizacji, dzielenia słów itp.Odpowiedzi:
[[ $a == $b ]]
to nie porównanie, to dopasowanie wzorca. Potrzebujesz[[ $a == "$b" ]]
porównania równości między bajtami.=
jest taki sam jak==
w każdej powłoce, która obsługuje[[...]]
(wprowadzona przezksh
).[[...]]
nie jest standardowąsh
składnią.[
Komenda jest standardem, a średnia porównanie operator nie ma=
(choć niektóre[
implementacje również rozpoznać==
).Podobnie jak w każdym argumencie dowolnego polecenia, zmienne muszą być cytowane, więc:
Standardowo
sh
dopasowywanie wzorców odbywa się za pomocącase
:Dla kompletności, inne operatory podobne do równości można spotkać w skryptach powłoki:
[ "$a" -eq "$b" ]
: standardowy[
operator do porównywania liczb całkowitych dziesiętnych. Niektóre[
implementacje dopuszczają spacje wokół liczb, niektóre pozwalają na dowolne wyrażenia arytmetyczne, ale to nie jest przenośne. Przenośnie można[ "$((a))" -eq "$((b))" ]
do tego użyć . Patrz również[ "$((a == b))" -ne 0 ]
, co byłoby równoważne średnia (z wyjątkiem POSIXly zachowanie jest określony tylko wtedy$a
i$b
zawierają całkowitą stałych) z:((a == b))
, z ksh, a także znalezione wzsh
ibash
, zwraca true, jeśli ocena wyrażenia arytmetycznego przechowywanego w$a
daje taką samą liczbę jak dla$b
. Zwykle służy do porównywania liczb. Zauważ, że istnieją różnice między powłokami dotyczące sposobu obliczania wyrażeń arytmetycznych i obsługiwanych liczb (na przykład bash i niektóre implementacje / wersje ksh nie obsługują liczb zmiennoprzecinkowych lub traktują liczby z wiodącymi zerami jako liczby ósemkowe).expr "$a" = "$b"
dokonuje porównania liczb, jeśli oba operandy są rozpoznawane jako dziesiętne liczby całkowite (niektóre pozwalają na spacje wokół liczby), a w przeciwnym razie sprawdza, czy dwa operatory łańcuchowe mają tę samą kolejność sortowania. Byłoby to również nie dla wartości$a
lub$b
które sąexpr
operatorzy podoba(
,substr
...awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
: jeśli$a
i$b
są rozpoznawane jako liczby (przynajmniej dziesiętne liczby całkowite i zmiennoprzecinkowe, takie jak 1,2, -1,5e-4, wiodące spacje końcowe są ignorowane, niektóre rozpoznają również wartości szesnastkowe, ósemkowe lub cokolwiek rozpoznawanego przezstrtod()
), wówczas wykonywane jest porównanie numeryczne. Inaczej, w zależności od implementacji, to albo porównanie ciąg bajt do bajta, lub jak zaexpr
pomocąstrcoll()
porównania, że to, czy$a
i$b
porządek to samo.Zobacz też:
źródło
Są one równoważne w bash:
Pierwsze dwie zmienne $ x nie muszą być cytowane. Bash wykonuje dzielenie słów i rozwijanie nazw ścieżek wewnątrz [ale nie wewnątrz [[:
[[ $x = "$y" ]]
to porównanie ciągów, ale[[ $x = $y ]]
wyrażenie pasujące do wzorca:-eq jest przeznaczony do użycia tylko z liczbami całkowitymi:
Zobacz także BashFAQ / 031: Jaka jest różnica między testem, [i [[? .
źródło