浮点导致Bash整数除法

时间:2013-02-22 02:21:32

标签: bash bc

我的服务器上有一个备份脚本,用于执行备份的cron作业,并向我发送备份文件的摘要,包括新备份文件的大小。作为脚本的一部分,我想将文件的最终大小除以(1024 ^ 3),以文件大小(以字节为单位)获取GB的文件大小。

由于bash没有浮点计算,我试图使用管道来获取结果,但是我对基本的例子感到难过。

我试图将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 `('

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

2 个答案:

答案 0 :(得分:42)

只需双引号(")表达式:

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

答案 1 :(得分:9)

请注意,您的echo $(( 22/7 )) | bc -l实际上使bash计算为22/7,然后将结果发送给bc。因此,整数输出不是bc的结果,而只是给bc的输入。

尝试echo $(( 22/7 ))而不将其管道输入bc,你会看到。