Question

Je sais qu'il est question vraiment stupide, mais je ne sais pas comment faire en bash:

20 / 30 * 100

Il doit être 66.67 mais expr dit 0, parce qu'il ne supporte pas flotter. Quelle commande Linux peut remplacer expr et faire equalation?

Était-ce utile?

La solution

Comme indiqué dans la page de manuel bash:

Le shell permet des expressions arithmétiques à évaluer, dans certaines circonstances ... L'évaluation se fait en nombres entiers à largeur fixe sans vérification de débordement, bien que la division par 0 est pris au piège et marqué comme une erreur.

Vous pouvez multiplier par 100 plus tôt pour obtenir un meilleur, résultat partiel:

let j=20*100/30
echo $j

66

Ou par un multiple de 10, et imaginez la virgule où il appartient:

let j=20*10000/30
echo $j

66666

Autres conseils

bc fera pour vous, mais l'ordre est important.

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

ou, pour votre cas particulier:

> 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 choisie, ceci est mûr pour l'inclusion en fonction pour rendre 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

J'utilise généralement perl:

perl -e 'print 10 / 3'

juste le faire dans awk

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

enregistrer à la variable

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

Ceci est une simplification de la réponse par paxdiablo. Le -l définit l'échelle (nombre de chiffres après la virgule) à 20. Il charge également une bibliothèque de mathématiques avec des fonctions trigonométriques et d'autres choses.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top