it-swarm.com.de

Gleitkomma-Vergleich im Shell-Skript

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
19
Kiran

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

18
ghostdog74

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.

56
Chen Levy

ein anderer einfacher, klarer Weg mit bc ist:

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi
6
Aquarius Power

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.

4
Steve Schnepp
### 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.

1
linuxaos

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
0
ungalcrys

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
0
Rakib Fiha