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

Eyken -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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. Eyken
       
      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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      $ echo 'scale=2; 12.75 / 2' | bc
      6.37
      
      $ A=$(echo 'scale=2; 12.75 / 2' | bc)
      
      $ echo $A
      6.37
      
      $
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

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