web-dev-qa-db-fra.com

Comment utiliser Expr sur Float?

Je sais que c'est vraiment une question stupide, mais je ne sais pas comment faire cela à Bash:

20 / 30 * 100

Ça devrait être 66.67 mais EXPR dit 0, parce que cela ne supporte pas flotter. Quelle commande sous Linux peut remplacer expr et faire cette égalité?

24
lauriys

bc va le faire pour vous, mais la commande est importante.

> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00

ou, pour votre cas spécifique:

> export ach_gs=2
> export ach_gs_max=3
> x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc)
> echo $x
66.66

Quelle que soit la méthode que vous choisissez, ceci est mûr pour l'inclusion en fonction de votre vie plus facile:

#!/bin/bash
function pct () {
    echo "scale = $3; $1 * 100 / $2" | bc
}

x=$(pct 2 3 2) ; echo $x # gives 66.66
x=$(pct 1 6 0) ; echo $x # gives 16
32
paxdiablo

J'utilise généralement Perl:

Perl -e 'print 10 / 3'
14
pgl

juste le faire dans awk

# awk 'BEGIN{print 20 / 30 * 100}'
66.6667

enregistrez-le à la variable

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
10
ghostdog74
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

C'est une simplification de la réponse de Paxdiablo. Le -l définit l'échelle (nombre de chiffres après la décimale) à 20. Il charge également une bibliothèque de mathématiques avec des fonctions de Trig et d'autres choses.

4
bjc