如何使用Bash算术运算处理错误?

时间:2019-03-14 13:50:47

标签: bash math error-handling

有什么方法可以处理Bash算术错误?例如,尝试不支持的浮点运算会导致错误:

$ echo $(( 3.5 + 1))
-bash: 3.5 + 1: syntax error: invalid arithmetic operator (error token is ".5 + 1")

我尝试通过逻辑OR或仅使输出静音来解决错误的尝试没有任何区别:

$ echo $(( 3.5 + 1)) ||true
-bash: 3.5 + 1: syntax error: invalid arithmetic operator (error token is ".5 + 1")
$ echo $(( 3.5 + 1)) 2>&-
-bash: 3.5 + 1: syntax error: invalid arithmetic operator (error token is ".5 + 1")

我确实看到这两种后备机制实际上如何应用于echo而不是算术运算本身,而后者是引发错误的原因。

有没有一种方法可以写一个或另一个应用到算术运算中?

2 个答案:

答案 0 :(得分:1)

如果您的表达式永远不等于0,则可以使用

((var=expr)) 2>&- && echo "$var"

一些例子:

prompt$ ((var =3+1)) 2>&- && echo "$var"
4
prompt$ ((var=3+1.5)) 2>&- && echo "$var"
prompt$ ((var=6/2)) 2>&- && echo "$var"
3
prompt$ ((var=6/0)) 2>&- && echo "$var"

这里唯一的问题是如果表达式的计算结果为0,则为假阳性

((var=0)) 2>&- && echo "$var" # does not print anything

有解决此问题的方法,但是它稍长一些

var=; ((var=0)) 2>&-; [ -n "$var" ] && echo "$var"

答案 1 :(得分:1)

如果只是要丢弃错误消息,那么尝试这样做的自然方法是

echo $(( 3.5 + 1)) 2>/dev/null

不幸的是,这不起作用。我猜是因为错误消息来自Bash本身。但是,这确实有效(至少在Bash 4.2上如此):

( echo $(( 3.5 + 1)) ) 2>/dev/null

(...)创建一个子外壳,在某些平台(尤其是Cygwin和WSL)上,该外壳非常昂贵。这个稍微凌乱的代码也可以使用,并且不会创建子shell:

{ echo $(( 3.5 + 1)) ; } 2>/dev/null