我使用bc进行一系列计算。
我通过bash脚本调用它,首先将所有表达式放在一个变量中,然后将它们传递给bc来计算结果。
脚本是这样的:
#!/bin/bash
....
list=""
for frml in `cat $frmlList`
do
value=`echo $frml`
list="$list;$value"
done
echo "scale=3;$list"| bc
frmlList变量包含一个表达式列表,这些表达式是另一个程序的输出,为简单起见,我不提及每个操作,但是在其内容之前进行了一些sed操作,然后将其分配给"值"变量
最后,"列表"变量包含由bc理解的分号分隔的表达式列表。
现在发生的事情是,在我的公式列表中,有时会发生除以0的分数。
当它发生时,bc停止计算,给出"运行时错误:除以零"。
我希望不要结束有关该错误的工作,但要跳过它并继续下一个公式评估。
有可能实现这样的目标吗?
同样的事情发生在一个更简单的情况:
echo "scale=2;1+1;1/0;2+2;" | bc
输出
2
Runtime error (func=(main), adr=17): Divide by zero
我想要像
这样的东西2
Runtime error (func=(main), adr=17): Divide by zero
4
提前谢谢你:)
答案 0 :(得分:1)
好的,最后我发现了一个可以很好地解决这个问题的解决方法。
这个想法是使用子shell并行执行bc,这样如果评估失败,另一个仍然可以完成。
在我的剧本中,我做了类似的事情:
#!/bin/bash
i=0
for frml in `cat $frmlList`
do
i=$((i+1))
(echo "scale=3;$value"| bc -l extensions.bc > "file_$i.tmp") &
if (( $i % 10 == 0 )); then
wait;
fi # Limit to 10 concurrent subshells.
done
#do something with the written files
答案 1 :(得分:0)
我知道没有简单的方法可以做到这一点。如果表达式是独立的,您可以尝试在bc
中运行它们。如果失败,请将它们逐个送到bc
,跳过破碎的。{/ p>
如果表达式相互依赖,那么您可能需要比bc
更强大的功能。或者,您可以尝试将表达式后的表达式附加到输入文件。如果bc
失败,请删除最后一个(可能从备份中恢复文件)并尝试使用下一个文件。