55

我的服务器上有一个备份脚本,它执行备份的 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 `('

有人可以给我一个正确的语法来获得具有复杂算术表达式的浮点结果吗?

4

2 回答 2

56

Just double-quote (") the expression:

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

Then bash will expand the $ variables and ignore everything else and bc will see an expression with parentheses:

$ 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 回答