Ich schrieb ein Bash-Skript und plötzlich begann dieses Verhalten:
[[ 1 < 2 ]]; echo $? # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1
-lt
funktioniert aber einwandfrei:
[[ 1 -lt 2 ]]; echo $? # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0
habe ich versehentlich <
irgendwie überschrieben ?
Hier ist ein Skript, das ich geschrieben habe, um dieses Verhalten zu testen:
#!/bin/bash
for a in {1..5}
do
for b in {1..20}
do
[[ $a < $b ]] && echo $a $b
done
echo
done
Hier ist die Ausgabe:
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
Wenn Sie im Skript auf wechseln <
, erhalten Sie -lt
eine normale Ausgabe ( 5 10
wird beispielsweise angezeigt).
Der Neustart hat nichts geändert.
Meine Bash-Version ist GNU Bash, Version 4.3.42 (1) -Release (x86_64-pc-linux-gnu). Ich bin auf Ubuntu 15.10. Ich weiß nicht, welche anderen Informationen hier relevant sind.
<
Operation führen Sie einen Zeichenfolgenvergleich durch, während der-lt
Operator ein numerischer Vergleich ist. Wenn Sie sich die aufgelisteten Ergebnisse ansehen, werden Sie es merken. Numerisch 2 ist kleiner als 10, alphabetisch umgekehrt.Antworten:
Von der
bash
Manpage.In der Ausgabe scheint es wie geplant zu funktionieren.
quelle
Wie wäre es mit:
Laut http://www.tldp.org/LDP/abs/html/dblparens.html
quelle
Erstens
[[
ist nicht POSIX und sollte vermieden werden.Zweitens, wenn Sie
<
als Teil eines arithmetischen Tests verwenden möchten, können Sie dies tun, jedoch mit einer anderen Syntax:Oder:
quelle