考虑以下:
$ echo "-1" | bc
-1
$ echo "(1)" | bc
1
$ echo "+1" | bc
(standard_in) 1: syntax error
减号和圆括号可以正确处理,但是当指定显式加号时bc
会出现错误。是否可以让它将显式正数视为正常正数?
我希望能够计算如下结构:
+1++2
(结果必须是 3)
即使是简单的 Ubuntu 计算器也可以进行这样的操作:
奇怪的是bc
不能。看起来像一个错误。
作为一种解决方法,sed
可以用来预处理 的输入bc
,或者可能bc
有一些特定的配置?或者可能有其他选择吗bc
?
更新
我已向 的支持团队发送请求bc
以考虑修复此错误。
库萨罗南达的评论:
bc
是一个 POSIX 实用程序,因此该实用程序的任何实现都应遵循POSIX 规范。本规范包含不包括一元加运算的语法。如果 GNU 在其 的实现中实现一元加bc
,他们将需要确保使用的所有现有代码bc
仍然像以前一样执行,并且使用的任何未来代码都bc
按照标准的读者所期望的方式执行。另请注意,这
-1--2
是一个错误,因此您似乎还建议更改递增和递减运算符的优先级,对吧?
我的评论:
我认为应该
bc
能够像简单计算器一样执行简单的计算。如果支持团队至少增加了bc
处理像 -1--2(结果 1)和 +1++2(结果 3)这样的数字的能力(仅对数字进行一元加运算,并且在尝试时不会出错)对现在不支持的数字执行递增/递减操作)在我看来,它不会影响现有或未来符合 POSIX 标准的代码。
尝试这个:
您可以直接使用 shell,
bash
但它有点麻烦,而且可能不那么健壮:两者的原理是相同的。我们
0+
给整个事物添加前缀,考虑到我们即将折叠多个+
符号,允许我们使用1+2
or+1+2
(第二个暂时导致0++1+2
)。然后,我们将连续的 {+
和 space} 序列剥离为单个+
。bc
目前不支持数字的一元加运算。它还将++
和--
操作视为递增和递减,尽管它们不支持数字。这适用于加号和减号的情况(添加一元加运算支持,修复增量和减量相关错误):
特别需要处理以下情况:
sed
预处理说明:s/\([-+]\) *+ */\1/g
- 将所有出现的- +
(之间有任意数量的空格)折叠为-
;+ +
到+
s/--/+/g
- 替换--
为+
s/^ *+//
- 删除前导+
(如果有)+ -
具有和 的案例- -
已得到以下支持bc
:作为简单计算的替代方案,
bc
可以使用内置的 bash 计算器来完成 -Arithmetic Expansion $((expression))
:如何在 Bash 中计算 [3 个实际示例]