使用Shell脚本解决算术问题

5

我希望你能协助解决一些关于脚本的问题...如果有人能帮忙,那真是太好了!

我的脚本包含以下内容:

VISITS=$((WR + RD));
SERVICE_DEMAND=$((VISITS*SERVICE_DEMAND));

我遇到了这个错误:

./calc_serv_demand.sh: 第12行: 0.0895406:语法错误:无效算术运算符(错误令牌为 ".0895406")

有人能帮我吗?

我认为这是因为Bash只能处理整数...但我需要使用浮点数。

谢谢提前。


问题已解决:

VISITS=$(echo $WR + $RD | bc); echo $VISITS

SERVICE_DEMAND=$(echo $VISITS '*' $SERVICE_TIME | bc); echo $SERVICE_DEMAND

5个回答

5

您可以使用bc进行浮点数计算,例如:

echo $WR + $RD | bc

等等。


它对于求和可以工作,但对于乘法不太好。这很奇怪,因为我已经查看了bc手册,它应该可以工作!看一下:我的脚本:echo $WR + $RD | bc &> VISITS; VISITS=$(echo $WR + $RD | bc); # 运行正常 echo $VISITSSERVICE_DEMAND=$(echo $VISITS * $SERVICE_TIME | bc); # 返回一个奇怪的错误 echo $SERVICE_DEMAND错误:0.0895406 3.42007 12.401 3.5096106 (standard_in) 1: 语法错误 (standard_in) 1: 非法字符:K (standard_in) 1: 非法字符:H (standard_in) 1: 非法字符:T ... - Alucard
@user:由于*在shell中具有特殊含义,因此您必须编写\\*'*'。另外,您应该直接将计算结果分配给变量,而不是输出到文件:VISITS=$(echo $WR + $RD | bc) - Benjamin Bannier
如果您对 * 进行 echo,它会显示当前目录中的所有文件名。只需在公式周围加上引号即可正常工作:SERVICE_DEMAND=$(echo "$VISITS * $SERVICE_DEMAND" | bc) - Dennis Williamson
引用您的变量,一切都应该没问题。echo "$WR+$RD" | bc - ghostdog74

3

不要使用bc,考虑切换到更好的编程语言。Bash对于数学计算非常不适合。


2

要设置精度(小数点后的数字位数),请写:

WR=5
RD=7
VISITS=$[WR+RD]
SERVICE_DEMAND=.0895406
SERVICE_DEMAND=`echo "scale=5; $VISITS * $SERVICE_DEMAND" |bc -l`
echo Service Demand = $SERVICE_DEMAND

这将输出:
Service Demand = 1.0744872
scale=5设置了5位数的精度;反引号使包含的表达式被计算,并将输出(来自bc -l)分配给您的变量。

但是...它返回了以下错误:(standard_in)2:语法错误 - Alucard
我刚在GNU bash上再次运行了这个程序,版本为4.0.35(1)-release (i586-suse-linux-gnu)。 - Larry Morell
Alucard,也许是你复制粘贴时引入了\r\n。尝试在你的副本上运行<code>dos2unix脚本名</code>。 - Larry Morell

2

1

在你的脚本中进行浮点数运算需要使用类似于bc这样的外部程序。

例如:

echo ($WR+$RD)*$SERVICE_DEMAND | bc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接