有什么方法可以处理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
而不是算术运算本身,而后者是引发错误的原因。
有没有一种方法可以写一个或另一个应用到算术运算中?
答案 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