55

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

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

円周率の値を一定の尺度で取得しようとしましたが、

次のように機能しますが:

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

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

4

2 に答える 2

56

式を二重引用符で囲みます("):

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
于 2013-02-22T02:35:43.403 に答える
12

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

echo $(( 22/7 ))bcに配管せずに試してみてください。そうすればわかります。

于 2015-04-07T23:36:43.950 に答える