Pisałem skrypt bash i nagle takie zachowanie się zaczęło:
[[ 1 < 2 ]]; echo $? # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1
ale -lt
działa solidnie:
[[ 1 -lt 2 ]]; echo $? # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0
czy <
jakoś przypadkowo nadpisałem ?
oto skrypt, który napisałem, aby przetestować to zachowanie:
#!/bin/bash
for a in {1..5}
do
for b in {1..20}
do
[[ $a < $b ]] && echo $a $b
done
echo
done
oto wynik:
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 20
3 4
3 5
3 6
3 7
3 8
3 9
4 5
4 6
4 7
4 8
4 9
5 6
5 7
5 8
5 9
zmiana <
na -lt
w skrypcie daje normalne wyjście ( 5 10
pokazuje na przykład).
Ponowne uruchomienie niczego nie zmieniło.
Moja wersja bash to GNU bash, wersja 4.3.42 (1) -release (x86_64-pc-linux-gnu). Jestem na Ubuntu 15.10. Nie wiem, jakie inne informacje są tutaj istotne.
<
operacją dokonujesz porównania ciągów, podczas gdy-lt
operator jest porównaniem numerycznym, jeśli spojrzysz na wymienione wyniki, zdasz sobie z tego sprawę. Liczbowo 2 to mniej niż 10, alfabetycznie, na odwrót.Odpowiedzi:
Ze strony podręcznika
bash
.Z wyniku wydaje się, że działa zgodnie z przeznaczeniem.
źródło
Co powiesz na:
Według http://www.tldp.org/LDP/abs/html/dblparens.html
źródło
Po pierwsze,
[[
nie jest POSIX i należy go unikać.Po drugie, jeśli chcesz użyć
<
jako część testu arytmetycznego, możesz to zrobić, ale z inną składnią:Lub:
źródło