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.arg1undnum1beziehen sich hier auf die gleichnamigen Shell-Variablen. Jede Variable wird als arithmetische Erweiterung interpretiert und das Ergebnis ersetzt. Hier, wenn$arg1010ist und$num14+5ist das Ergebnis false (der Befehl((...))wird mit einem Exit-Status ungleich Null zurückgegeben), da010ist für 8 oktal und4+5ist 9. -
(($arg1 >= $num1)): wie oben, außer dass$arg1und$num1werden erweitert, bevor dieser gesamte arithmetische Ausdruck ausgewertet wird. Wenn$arg1(2und$num12), der vorherige Befehl wäre fehlgeschlagen, da(2und2)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$arg1und$num1berü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().