Opérations arithmétiques avec expr et variables

Pourquoi cette déclaration ne fonctionne-t-elle pas?

total=`expr $mPercent / 100 "*" .482 + $fPercent / 100 "*" .518` 

mPercent est un nombre à la suite d'une déclaration awk, ainsi que fPercent. J'obtiens également "expr: argument non-numérique" comme un message d'erreur.

NOTE: Pour les besoins de sa question, disons que les 2 variables ont la valeur 3,27.

bash ne peut pas faire d'opérations en floating point, seulement des entiers. Je suggère d'utiliser bc -l place:

 $ mPercent='2.72' $ fPercent='3.14' $ bc -l <<< $(echo "$mPercent / 100 "*" .482 + $fPercent / 100 "*" .518") .02937560000000000000 

La command expr ne peut faire que des manipulations d'entier ou de string. Regardez la page de manuel pour ce guide:

Les opérandes sont des entiers ou des strings. Les entiers se composent d'un ou de plusieurs numbers décimaux, avec un '-' en tête facultatif. 'expr' convertit tout ce qui apparaît dans une position d'opérande en un entier ou une string en fonction de l'opération qui lui est appliquée.

Donc, pour effectuer ce type d'opération, vous devrez faire appel à un caluclateur de command line tel que bc .

Exemple

 $ mPercent='.123' $ fPercent='.345' $ echo "$mPercent / 100 * .482 + $fPercent / 100 * .518" | bc -l .00237996000000000000 

NOTE: expr ne fait pas partie de Bash, c'est un exécutable autonome qui fait partie du package coreutils. Sur les systèmes utilisant des RPM, vous pouvez voir ceci comme ceci:

 $ rpm -qf $(type -p /usr/bin/expr) coreutils-8.21-13.fc19.x86_64 

L'utilisation des données que vous avez fournies dans les commentaires de 3.27 pour les 2 variables donne les résultats suivants:

 $ mPercent='3.27' $ fPercent='3.27' $ echo "$mPercent / 100 * .482 + $fPercent / 100 * .518" | bc -l .03270000000000000000 

Ma suggestion est d'utiliser bc pour l'opération arithmétique et <<< (Here Ssortingng) pour entrer les valeurs dans bc .

 $ mPercent=3.27 $ fPercent=3.27 $ bc -l <<< "$mPercent / 100 * .482 + $fPercent / 100 * .518" .03270000000000000000 

L'option -l de bc vous permet d'utiliser l'arithmétique à floating point avec plus de fonctions mathématiques.