Diese Frage hat hier bereits Antworten :
Kommentare
Antwort
Diese Operatoren werden beispielsweise in (( ... ))
und $(( ... ))
( arithmetische Auswertung bzw. arithmetische Erweiterung ):
if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi
Und auch mit let
. Das Folgende entspricht dem oben Gesagten:
if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi
Siehe den Abschnitt „ARITHMETISCHE BEWERTUNG“ im Bash-Handbuch.
Antwort
In bash
speziell:
-
((arg1 >= num1))
(geerbt vonksh
) führt einen arithmetischen Vergleich durch.arg1
undnum1
beziehen sich hier auf die gleichnamigen Shell-Variablen. Jede Variable wird als arithmetische Erweiterung interpretiert und das Ergebnis ersetzt. Hier, wenn$arg1
010
ist und$num1
4+5
ist das Ergebnis false (der Befehl((...))
wird mit einem Exit-Status ungleich Null zurückgegeben), da010
ist für 8 oktal und4+5
ist 9. -
(($arg1 >= $num1))
: wie oben, außer dass$arg1
und$num1
werden erweitert, bevor dieser gesamte arithmetische Ausdruck ausgewertet wird. Wenn$arg1
(2
und$num1
2)
, der vorherige Befehl wäre fehlgeschlagen, da(2
und2)
für sich genommen keine gültigen Ausdrücke sind. Aber hier würde es gelingen, weil(2 >= 2)
der arithmetische Ausdruck wäre, der ausgewertet wird. Im Allgemeinen ist es in arithmetischen Ausdrücken besser, das$
wegzulassen. Vergleichen Sie beispielsweisea=2+2; echo "$((3 * $a))"
mit . -
let "..."
(auch von ksh). Wie((...))
, außer dass es „s Als normaler Befehl analysiert, weniger lesbar, ebenso wenig tragbar und Sie müssen dem Zitieren mehr Aufmerksamkeit schenken. -
[ "$arg1" -ge "$num1" ]
. Dies ist Standard und portabel. Es werden nur Dezimalkonstanten unterstützt.[ 010 -ge 9 ]
entspricht[ 10 -ge 9 ]
. -
[[ $arg1 -ge $num1 ]]
. Auch von ksh, jedoch mit großen Unterschieden. Diesmal werden$arg1
und$num1
berücksichtigt als arithmetische Ausdrücke und nicht nur als Dezimalkonstanten.[[ 010 -ge 9 ]]
gibt wieder false zurück. -
[[ $arg1 < $num1 ]]
. String-Vergleichstrcoll()
zum Vergleichen von Zeichenfolgen, also unter Verwendung des Sortieralgorithmus im Gebietsschema. Beachten Sie, dass<
und>
Verwenden Sie den Sortieralgorithmus=
/==
führen Sie einen Byte-zu-Byte-Vergleich durch, sodass möglicherweise Zeichenfolgenpaare vorhanden sind, für die alle<
,>
und=
/==
gibt false zurück.<=
und>=
werden nicht unterstützt. -
[ "$arg1" "<" "$num1" ]
. Nicht standardisiert. Wie oben, jedoch mit dem Befehl[
.<
muss in Anführungszeichen gesetzt werden, damit es nicht als Umleitungsoperator verwendet wird. -
expr " $arg1" "<=" " $num1" > /dev/null
(beachten Sie die Einbettung Leerzeichen, um einen lexikalischen Vergleich zu erzwingen und Probleme mit Zeichenfolgen zu vermeiden, die wieexpr
-Operatoren) oderawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
aussehen, sind die Standardbefehle für den Zeichenfolgenvergleich mitstrcoll()
.