Ich fange an zu lernen, wie man Skripte für das Bash-Terminal schreibt, aber ich kann nicht herausfinden, wie die Vergleiche richtig funktionieren. Das Skript, das ich verwende, ist:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
Das Problem ist, dass es die Zahl von der ersten Ziffer an vergleicht, dh 9 ist größer als 10, aber 1 ist größer als 09.
Wie kann ich die Zahlen in einen Typ umwandeln, um einen echten Vergleich durchzuführen?
;
am Ende der Zeile überflüssig. Kein Schaden anrichten, nur eine Verschwendung von Tastenanschlägen (es sei denn, Sie tippen gerne Semikolons).10#$number
sonumber=09; echo "$((10#$number))"
ausgeben wird ,9
währendecho $((number))
produziert ein „Wert zu groß für die Basis“ -Fehler.>
Operator im[
Befehl vergleicht die Reihenfolge, in der zwei Zeichenfolgen sortiert werden sollen, und nicht die Reihenfolge, in der sie als Zahlen sortiert werden. Weitere Informationen finden Sie inman test
.Antworten:
In bash sollten Sie Ihre Prüfung im arithmetischen Kontext durchführen :
Für POSIX-Shells, die nicht unterstützt werden
(())
, können Sie-lt
und verwenden-gt
.Sie können eine vollständige Liste der Vergleichsoperatoren mit
help test
oder erhaltenman test
.quelle
"$a" -gt "$b"
ist die richtige Antwort. Hier ist eine gute Liste der Testfahrer: Test - Konstrukte .test
ein Programm ist, wie es ist[
. Sohelp test
gibt Auskunft darüber. Um herauszufinden, was die integrierten Funktionen ([[
und((
) tun, sollten Siehelp bash
diesen Teil verwenden und zu ihm navigieren.Schlicht und einfach
Sie können sich dieses Cheatsheet ansehen, wenn Sie mehr Zahlenvergleiche in der wundervollen Welt von Bash Scripting wünschen.
Ganzzahlen können nur kurz verglichen werden mit:
quelle
"$a"
und"$b"
sind nicht unbedingt notwendig, aber sie sind eine gute Praxis. Geschweifte Klammern machen hier nichts Nützliches."
obligatorisch oder ist es[ $a -eq $b ]
auch in Ordnung?Es gibt auch eine nette Sache, von der manche Leute vielleicht nichts wissen:
Dieser Code druckt die kleinste Zahl aus
a
undb
quelle
b
wenna == b
.echo "The smaller number is $(( a < b ? a : b ))."
a < b
immer noch wahr ist, wenna == b
. Ich kenne nicht alle Launen von Bashs Bedingungen, aber es gibt mit ziemlicher Sicherheit Situationen, in denen dies einen Unterschied machen würde.a == b
, wird danna < b
als falsch ausgewertet, weshalb es gedruckt wirdb
.In Bash bevorzuge ich dies, da es sich eher als bedingte Operation als als
(( ))
arithmetische Operation bezeichnet .Es sei denn, ich mache komplexe Sachen wie
Aber jeder hat nur seine eigenen Vorlieben. Traurige Sache ist, dass einige Leute ihre inoffiziellen Standards auferlegen.
Aktualisieren:
Sie können dies auch tun:
Damit können Sie
[[ ]]
neben arithmetischen Dingen noch etwas hinzufügen, mit dem Sie etwas anfangen können.quelle
[[ ]]
ein arithmetischer Kontext erzwungen wird(( ))
, in demN
behandelt wird, als ob es so wäre$N
, aber ich denke nicht, dass das richtig ist. Oder, wenn das nicht die Absicht war, ist die Verwendung vonN
undM
verwirrend.[[
BefehlArg1
undArg2
als arithmetische Ausdrücke ausgewertet [...]".NUMBER=0.0; while [[ "$NUMBER" -lt "1.0" ]]; do
und es heißtbash: [[: 0.0: syntax error: invalid arithmetic operator (error token is ".0")
Dieser Code kann auch Floats vergleichen. Es wird awk verwendet (es ist keine reine Bash), dies sollte jedoch kein Problem sein, da awk ein Standard-POSIX-Befehl ist, der höchstwahrscheinlich standardmäßig mit Ihrem Betriebssystem geliefert wird.
Verwenden Sie diese Funktion, um die Verwendung zu verkürzen:
quelle
bash
kann sie nicht richtig vergleichen (versuchenif (( 18446744073692774399 < 8589934592 )); then echo 'integer overflow'; fi
).awk
funktioniert wie ein Zauber (if awk "BEGIN {return_code=(18446744073692774399 > 8589934592) ? 0 : 1; exit} END {exit return_code}"; then echo 'no integer overflow'; fi
).Wenn Sie Floats haben, können Sie eine Funktion schreiben und diese dann verwenden, z
quelle
Das Klammermaterial (z. B.
[[ $a -gt $b ]]
oder(( $a > $b ))
) reicht nicht aus, wenn Sie auch Gleitkommazahlen verwenden möchten. es würde einen Syntaxfehler melden. Wenn Sie Gleitkommazahlen oder Gleitkommazahlen mit Ganzzahlen vergleichen möchten, können Sie verwenden(( $(bc <<< "...") ))
.Zum Beispiel,
Sie können mehr als einen Vergleich in die if-Anweisung aufnehmen. Zum Beispiel,
Dies ist hilfreich, wenn Sie überprüfen möchten, ob eine numerische Variable (Ganzzahl oder nicht) innerhalb eines numerischen Bereichs liegt.
quelle
if [ "$(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b; fi
if [ $(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b"; fi
? (Ich denke, Ihr Befehl wurde falsch geschrieben.) Wenn ja, funktioniert das auch. Der Befehl Bash Calculator (bc) ist ein grundlegender Taschenrechnerbefehl. Einige weitere Anwendungsbeispiele finden Sie hier und hier . Ich weiß nicht, warum mein Beispielbefehl bei Ihnen nicht funktioniert hat.Ich habe dies gelöst, indem ich eine kleine Funktion verwendet habe, um Versionszeichenfolgen in einfache ganzzahlige Werte zu konvertieren, die verglichen werden können:
Dies macht zwei wichtige Annahmen:
Zum Beispiel
Beispiel für das Testen, ob der
npm
Befehl die Mindestanforderung erfüllt ...quelle