浮点运算导致Bash整数除法

浮点运算导致Bash整数除法,bash,bc,Bash,Bc,我的服务器上有一个备份脚本,它执行cron备份任务,并向我发送备份文件的摘要,包括新备份文件的大小。作为脚本的一部分,我想将文件的最终大小除以(1024^3),从以字节为单位的文件大小得到以GB为单位的文件大小 由于bash没有浮点计算,所以我尝试使用到bc的管道来获得结果,但是我在基本示例中遇到了难题 我试着把π的值调整到一个刻度,但是 尽管以下方法有效: ~ #bc -l bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006

我的服务器上有一个备份脚本,它执行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
#a=22 ; b=7
#echo $(( a/b )) | bc -l
3
这项工作:

#echo '22/7' | bc -l
3.14285714285714285714
但我需要使用变量。因此,以下措施不起作用也无济于事:

#echo $(( 22/7 )) | bc
3
#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 `('
有人能给我一个正确的语法来获得复杂算术表达式的浮点结果吗?

只需双引号(
)表达式:

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

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


尝试
echo$((22/7))
不通过管道将其传输到bc,您会看到。

太棒了。我从未想过使用双引号来扩展变量。谢谢!Mhhh?双引号不会扩展变量,但允许这样做。亲爱的,如果我偶然发现这一点,我会切换到python。可以教bash,例如使用浮点结果进行整数除法:参见: