(shell) Opération de réels avec flottants

Bonjour,
J'ai pour devoir de créer pour mes études un script shell calculant le moyenne des nombres rajoutés en paramètres.
Le script doit bien sur pouvoir calculer les chiffres à virgules.

Voila mon script :

#!/bin/bash    
count='0'    
somme='0'    
for var    
do    
echo "scale=2 ; $somme+$var"   #on vérifie l'opération effectuée à chaque addition    
let "somme=$somme+$var"    
let "count=$sount+1"    
done    
echo "scale=2 ; $somme/$count" | bc    

L'emploie de scale sur la fin permet d'afficher le résultat avec 2 chiffres après la virgule, mais cela ne marche que si les paramètres rentrés sont des entiers. Si l'on y met des nombres à virgule, leur addition les transforme automatiquement en entier, et je n'arrive pas à employer SCALE lors de l'addition des variables entre elles.

Quelqu'un aurait une solution à me proposer ?

Merci d'avance !!

2 réponses

  1. Contributeur
    hello
    scale est une option de bc, pas du shell. le shell ne peut pas faire d'opérations flottantes, il faut utiliser bc, awk, dc pour faire tout les calculs
    0
    1. Merci de l'info !
      Un moyen pour y parvenir ?
      Je débute grandement dans tout ce domaine ^^
      J'arrive à employer bc en echo mais pas à l'intégrer dans une variable pour pouvoir le réutiliser par la suite.
      0
    2. Contributeur
      $ echo 'scale=2; 12.75 / 2' | bc
      6.37
      
      $ A=$(echo 'scale=2; 12.75 / 2' | bc)
      
      $ echo $A
      6.37
      
      $
      0
    3. Contributeur
      je construit la formule avec les paramètres et je l'envoie dans bc
      $ ./f2  2.2 3.3 5.5 
      scale=2 ; (2.2+3.3+5.5+0 )/3
      3.66
      $ 
      $ cat f2
      #!/bin/bash
      printf "scale=2 ; (" ; printf "%s+" $@ ; printf  "0 )/$#\n"
      (printf "scale=2 ; (" ; printf "%s+" $@ ; printf  "0 )/$#\n") | bc
      
      0
  2. Contributeur
    Salut,

    Si l'on y met des nombres à virgule, leur addition les transforme automatiquement en entier, et je n'arrive pas à employer SCALE lors de l'addition des variables entre elles.
    Normal, bc utilise le point comme décimal et non la virgule.
    $ echo 'scale=2; 12.75 / 2' | bc
    6.37
    De plus, ta syntaxe "for var;do..." n'est pas bonne, il faut donner du grain à moudre à la boucle for :
    for var in "${@}"
    do 
    ...
    done
    0
    1. Contributeur
      hello
      for var ; do est synonyme de for var in $@ ; do
      $ set a b c d ; for X ; do echo $X ; done
      a
      b
      c
      d
      
      0
    2. Contributeur
      Salut,

      Merci, je me coucherai bien moins c*n ce soir ;-\
      0