Division bash

arkard Messages postés 19 Statut Membre -  
 stevec -
Bonjour,

Je suis une quiche en scripting, mais quand il faut, on n'a pas le choix.
J'essaie vainement de faire une division sous bash.
Mon script fait 2 requetes SQL que je stocke en variable et je veux faire un ratio de ces 2 variables, le multiplier par 100, le retrancher de 100 et l'arrondir à l'entier supérieur.
J'essaie d'abord de faire la division en faisant un bête RES=($1/$2), comme j'ai vu sur différents forums mais ça m'affiche par exemple 5/9, ça ne fait donc pas la division, ça m'affiche le résultat des 2 requetes (qui elles fonctionnent bien d'ailleurs).

Help please !

4 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    pour passer en mode mathématique, il faut deux parenthèses normalement.
    (( res = $1/$2 ))
    mais attention, bash travail sur des entiers, donc il vaut mieux faire res=(100*$1)/$2
    1
  2. arkard Messages postés 19 Statut Membre
     
    Bah en fait même quand je fais res=(100*$1)/$2, quand je fais le echo $RESil me répond (100*5)/9
    0
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      essai les lignes suivante dans ta console :
      exec bash
      a=18
      b=2
      (( res=$a/$b ))
      echo $res

      si ça n'affiche pas 9, c'est qu'il y a un souci ailleurs.
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      si tu veux utiliser des flottant, mieux vaut utiliser bc (cf. man bc).
      0
  3. arkard Messages postés 19 Statut Membre
     
    exec bash
    a=18
    b=2
    (( res=$a/$b ))
    echo $res

    Ca ça marche.

    Dans mon script j'ai mis (( res=$a/$b )) et j'ai mis le echo $res derriere et maintenant il me dit 0
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      comme écrit plus haut, bash ne fait que des divisions entères, faire
      res=$((echo "scale=4 ; $a/$b" | bc))
      0
  4. arkard Messages postés 19 Statut Membre
     
    Avec ça j'ai le droit à un syntax error: invalid arithmetic operator (error token is ""scale=4 ; 5/11" | bc")
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      j'ai mis trop de parenthéses au post 6
      $ a=5 ; b=11 
      $ res=$(echo "scale=4 ; $a/$b" | bc) 
      $ echo $res 
      .4545 
      $ 
      0
    2. arkard Messages postés 19 Statut Membre
       
      Cool, ca marche mieux merci mais le résultat est .4545, comment faire pour avoir le 0 ?
      0
    3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      comme je t'ai dit : "man bc" tu trouvera la réponse.
      D'un autre coté, comme ton but final est d'avoir un entier, mieux vaut tout faire pour écrire directement ta formule en conséquence, c'est à dire en multipliant par 100 dès le début déjà.
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      $ printf "%.4f\n"  $res
      0.4545
      $ 
      0
    5. arkard Messages postés 19 Statut Membre
       
      Merci beaucoup !
      0