2013-02-22 102 views
24

我的服务器上有一个备份脚本,它执行备份的cron作业,并向我发送已备份文件的摘要(包括新备份文件的大小)。作为脚本的一部分,我想通过(1024^3)将文件的最终大小除以文件大小(以字节为单位)以GB为单位获取文件大小。Bash整数除法中的浮点数结果

因为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 

我明显缺少在语法东西猛砸中使用变量,可以用什么我误解了一些“指针”使用。

正如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 `(' 

有人可以给我一个工作的正确语法掌握浮点结果复杂的算术表达式?

+0

可以教bash例如整数除法与浮点结果:请参阅:http://stackoverflow.com/a/24431665/3776858 – Cyrus 2014-07-26 12:21:38

回答

31

只是双引号(")表达:

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 
+0

太棒了。我从来没有想过用双引号来扩展变量。谢谢! – Droidzone 2013-02-22 02:54:05

+0

Mhhh?双引号不会扩展变量,但允许这样做。 – 2013-02-22 03:29:48

+0

甜蜜,如果我偶然发现了这个,我会切换到python。 – Gurubaran 2016-09-23 18:41:22

7

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

尝试echo $((22/7))没有管道到bc,你会看到。