Können Sie mir bitte die Syntax für den Fließkomma-Vergleich in einem Bash-Skript vorschlagen? Ich möchte es idealerweise als Teil einer if
-Anweisung verwenden. Hier ist ein kleiner Codeausschnitt:
key1="12.3"
result="12.2"
if (( $result <= $key1 ))
then
# some code here
fi
bash macht keine floats, benutze awk
key1=12.3
result=12.5
var=$(awk 'BEGIN{ print "'$key1'"<"'$result'" }')
# or var=$(awk -v key=$key1 -v result=$result 'BEGIN{print result<key?1:0}')
# or var=$(awk 'BEGIN{print "'$result'"<"'$key1'"?1:0}')
# or
if [ "$var" -eq 1 ];then
echo "do something"
else
echo "result more than key"
fi
es gibt andere Shells, die Floats ausführen können, wie zsh oder ksh. Vielleicht möchten Sie auch versuchen, sie zu verwenden
bc
ist dein Freund:
key1="12.3"
result="12.2"
if [ $(bc <<< "$result <= $key1") -eq 1 ]
then
# some code here
fi
Beachten Sie die etwas undurchsichtige here string (<<<
) -Notation als nette Alternative zu echo "$result <= $key1" | bc
.
Außerdem gibt die Un-Bash-ähnliche bc
den 1
für true und den 0
für false aus.
ein anderer einfacher, klarer Weg mit bc ist:
if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi
Die Verwendung der Funktion exit()
von awk
macht es fast lesbar.
key1=12.3
result=12.5
# the ! awk is because the logic in boolean tests
# is the opposite of the one in Shell exit code tests
if ! awk "{ exit ($result <= $key1) }" < /dev/null
then
# some code here
fi
Beachten Sie, dass der Operator [
nicht erneut verwendet werden muss, da if
bereits den Exit-Wert verwendet.
### The funny thing about bash is this:
> AA=10.3
> BB=10.4
### It needs `$` for compare
> [[ $AA > $BB ]] && echo Hello
> [[ $AA < $BB ]] && echo Hello
Hello
Ja, ich weiß, dass es betrügt, aber es funktioniert. Und die wissenschaftliche Notation funktioniert hier nicht.
wenn Sie diesen awk-Vergleich in einer if-Klausel verwenden können, wird 1 (true) ausgegeben, wenn die Bedingung true ist, andernfalls 0 (false), und diese Werte werden vom if als boolesche Werte interpretiert
if (( $(awk 'BEGIN {print ("'$result'" <= "'$key1'")}') )); then
echo "true"
else
echo "false"
fi
Ich benutzte bc bis jetzt und fand heraus, dass in einigen Distributionen nicht bc installiert war und ich wollte nicht Sudo apt install bc
durchgehen, aber Python war da. Verwenden von Python:
if python -c "import sys; sys.exit(0 if float($float_1) > float($float_2) else 1)";
then
echo "true"
else
echo "false"
fi