Question Comparaison des points flottants dans Shell Script


Pouvez-vous me suggérer la syntaxe pour effectuer une comparaison en virgule flottante dans un script Bash? Je voudrais idéalement l'utiliser dans le cadre d'un if déclaration. Voici un petit extrait de code:

key1="12.3"
result="12.2"

if (( $result <= $key1 ))
then
    # some code here
fi

17
2018-03-11 12:18


origine


Réponses:


bash ne fait pas de flotteurs, utilise 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

il y a d'autres shells qui peuvent faire des flottants, comme zsh ou ksh, vous pouvez aussi essayer de les utiliser


16
2018-03-11 12:21



bc est votre ami:

key1="12.3"
result="12.2"
if [ $(bc <<< "$result <= $key1") -eq 1 ]
    then
    # some code here
fi

Notez le peu obscur ici la ficelle (<<<) notation, comme une bonne alternative à echo "$result <= $key1" | bc.

Aussi, le non-bash-like bc estampes 1 pour vrai et 0 pour faux.


53
2018-03-11 12:31



une autre façon simple et claire avec bc est la suivante:

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

6
2018-06-07 12:33



En utilisant le exit() fonction de awk le rend presque lisible.

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

Notez qu'il n'est pas nécessaire de réutiliser le [ opérateur comme if utilise déjà la valeur de sortie.


4
2017-11-29 10:08



### The funny thing about bash is this:
> AA=10.3
> BB=10.4
> [[ AA > BB ]] && echo Hello
> [[ AA < BB ]] && echo Hello
Hello

Oui, je sais que c'est de la triche mais ça marche. Et la notation scientifique ne fonctionne pas ici.


1
2018-03-29 13:53



Vous pouvez utiliser cette comparaison awk dans une clause if, elle affichera 1 (true) si la condition est vraie, sinon 0 (false), et ces valeurs seront interprétées comme des valeurs booléennes par if

if (( $(awk 'BEGIN {print ("'$result'" <= "'$key1'")}') )); then
    echo "true"
else
    echo "false"
fi

0
2017-08-10 09:09