Tentative d'arithmétique bash pour un script, mais $e
ne se met pas à jour jusqu'à la fin. La sortie parle d'elle-même.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: Affiche 1..5 en pourcentage.
Production :
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
Pourquoi est-ce?
command-line
bash
scripts
Cybex
la source
la source
Réponses:
bash
ne peut pas gérer l'arithmétique non entière. Il vous donnera le résultat correct tant que toutes les expressions sont des entiers. Vous devez donc éviter d'obtenir une valeur non entière quelque part dans votre calcul.Dans votre cas, lorsque vous évaluez
1 / 5
,2 / 5
etc., il crée les valeurs zéro entières dans les correspondances bash à certaines valeurs non entières et les résultats sortent à zéro en conséquence. La priorité de la division et de la multiplication sont les mêmes et les mêmes opérateurs précédents sont toujours exécutés de gauche à droite lorsqu'ils sont placés dans l'expression.Une solution consiste à faire d'abord la multiplication, puis la division afin que bash n'ait jamais à gérer une valeur non entière. L'expression corrigée sera,
la source
1/5
- expression ne crée pas de valeur non entière . Il crée la valeur entière0
, car le résultat de la division entière de 1 par 5 est 0. D'autres opérations utilisent avec succès cette valeur de0
. Ce n'est pas ce que l'OP avait prévu, mais aucune opération ne crée une valeur non entière et aucune opération échoue.Bash ne fait pas très bien ce genre d'arithmétique ... Voici votre problème:
Si vous devez gérer des valeurs non entières, vous pouvez utiliser
bc
(merci à @Arronical d'avoir indiqué comment formater la sortie sous forme d'entiers)
la source
.0
de la sortie en changeant$percent
votre écho en${percent%.*}
:)Contrairement à bash, awk propose une arithmétique à virgule flottante complète. Par exemple:
la source
Essayer
:)
Voir la section ÉVALUATION ARITHMÉTIQUE de:
Il prend uniquement en charge l'entier.
la source