管道到 bc 给出不一致的语法错误

Pipe to bc gives inconsistent syntax errors

我必须将整数比较(以及更复杂的算术和布尔运算)传递给 bc,并且我必须在某些数据丢失时跟踪语法错误。

我似乎发现了一些与 bc 不一致的行为。

当然 :

echo "1==7" | bc 给出布尔值 0

echo "==7" | bc 给出 (standard_in) 1: syntax error

但是:

echo -e "==1\n==7" | bc
(standard_in) 1: syntax error`
7

而不是 7,人们会期望第二行出现 (standard_in) 2: syntax error

为了这些解释,我简化了 bc 的输入,但我必须用更复杂的算术和布尔运算来解决这个奇怪的行为。

解决方法 正如@KamilCok 在下面注意到的那样,一种解决方法是插入换行符

echo -e "==1\n==7" | awk 'ORS="\n\n"' | bc

不,这与键盘输入绝对一致。

我怀疑 bc 有一个 奇怪的 解析错误行为,仅此而已。

我认为这是 GNU bc 中的 yacc 解析器中的错误。我看到在比较之间插入有效语句似乎重置了状态。

echo -e "==1\n1\n==7" | bc
(standard_in) 1: syntax error
1
(standard_in) 3: syntax error

因此,解决方法是在比较之间输入一个空的有效语句(例如 1)。真正的解决方案是为 GNU bc 编写补丁并通知开发人员。