bc:阻止"除以零"多个操作的运行时错误

时间:2015-06-08 08:54:13

标签: bash shell math bc

我使用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

提前谢谢你:)

2 个答案:

答案 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失败,请删除最后一个(可能从备份中恢复文件)并尝试使用下一个文件。