web-dev-qa-db-ja.com

浮動小数点はBash整数除算になります

サーバー上にバックアップのcronジョブを実行するバックアップスクリプトがあり、新しいバックアップファイルのサイズなど、バックアップされたファイルの概要を送信します。スクリプトの一部として、ファイルの最終サイズを(1024 ^ 3)で割って、バイト単位のファイルサイズからGB単位のファイルサイズを取得します。

Bashには浮動小数点計算がないため、bcにパイプを使用して結果を取得しようとしていますが、基本的な例に困惑しています。

Piの値を一定の大きさにしようとしましたが、

次のように動作しますが:

~ #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

非対話型バージョンは機能しません:

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

これは動作します:

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

しかし、変数を使用する必要があります。したがって、以下が機能しないことは役に立ちません:

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

Bashで変数を使用するための構文に明らかに欠けているものがあり、誤解したものを「ポインター」で使用できます。

DigitalRossが言ったように、私は次のものを使用できます。

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

ただし、次のような複雑な式は使用できません。

#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 `('

複雑な算術式で浮動小数点の結果を得るための正しい構文を誰かに教えてもらえますか?

39
Joel G Mathew

式を二重引用符で囲む("):

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

次に、bashは$変数を展開し、他のすべてを無視し、bcは括弧付きの式を表示します。

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

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

echo $(( 22/7 )) | bc -lは実際にbashに22/7を計算させ、その結果をbcに送信することに注意してください。したがって、整数出力はbcの結果ではなく、単にbcに与えられた入力です。

Bcにパイプせずにecho $(( 22/7 ))を試してみてください。

10
user834425