web-dev-qa-db-fra.com

Résultats en virgule flottante dans la division entière de Bash

J'ai un script de sauvegarde sur mon serveur qui effectue des tâches cron de sauvegarde et m'envoie un résumé des fichiers sauvegardés, y compris la taille du nouveau fichier de sauvegarde. Dans le cadre du script, je voudrais diviser la taille finale du fichier par (1024 ^ 3) pour obtenir la taille du fichier en Go, de la taille du fichier en octets.

Étant donné que bash n'a pas de calcul en virgule flottante, j'essaie d'utiliser des tuyaux vers bc pour obtenir le résultat, mais je suis perplexe sur des exemples de base.

J'ai essayé d'obtenir la valeur de Pi à une échelle, cependant,

même si ce qui suit fonctionne:

~ #bc -l
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
4/3
1.33333333333333333333
22/7
3.14285714285714285714
q
0
quit

Une version non interactive ne fonctionne pas:

#echo $(( 22/7 )) | bc
3

Cela marche:

#echo '22/7' | bc -l
3.14285714285714285714

Mais je dois utiliser des variables. Donc, cela n'aide pas que ce qui suit ne fonctionne pas:

#a=22 ; b=7
#echo $(( a/b )) | bc -l
3

Il me manque manifestement quelque chose dans la syntaxe pour utiliser des variables dans Bash, et je pourrais l'utiliser avec quelques "pointeurs" sur ce que j'ai mal compris.

Comme l'a dit DigitalRoss, je peux utiliser les éléments suivants:

#echo $a / $b | bc -l
3.14285714285714285714

Cependant, je ne peux pas utiliser d'expressions complexes comme:

#echo $a / (( $b-34 )) | bc -l
-bash: syntax error near unexpected token `('
#echo $a / (( b-34 )) | bc -l
-bash: syntax error near unexpected token `('
#echo $a / (( b-34 )) | bc -l
-bash: syntax error near unexpected token `('

Quelqu'un peut-il me donner une syntaxe correcte pour obtenir des résultats en virgule flottante avec des expressions arithmétiques complexes?

39
Joel G Mathew

Juste un guillemet double (") l'expression:

echo "$a / ( $b - 34 )" | bc -l

Bash étendra le $ variables et ignorer tout le reste et bc verra une expression entre parenthèses:

$ a=22
$ b=7
$ echo "$a / ( $b - 34 )" 
22 / ( 7 - 34 )

$ echo "$a / ( $b - 34 )" | bc -l
-.81481481481481481481
42
Adrian Pronk

Veuillez noter que votre echo $(( 22/7 )) | bc -l fait en fait bash calculer 22/7 puis envoyer le résultat à bc. La sortie entière n'est donc pas le résultat de bc, mais simplement l'entrée donnée à bc.

Essayez echo $(( 22/7 )) sans le rediriger vers bc, et vous verrez.

10
user834425