Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Bash算术运算处理错误?_Bash_Math_Error Handling - Fatal编程技术网

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

如何使用Bash算术运算处理错误?,bash,math,error-handling,Bash,Math,Error Handling,有没有办法处理Bash算术运算的错误?例如,尝试不受支持的浮点操作会导致错误: $echo$((3.5+1)) -bash:3.5+1:语法错误:算术运算符无效(错误标记为“.5+1”) 我尝试使用逻辑OR或仅通过使输出静音来解决错误,但没有产生任何差异: $echo$((3.5+1))||正确 -bash:3.5+1:语法错误:算术运算符无效(错误标记为“.5+1”) $echo$((3.5+1))2>&- -bash:3.5+1:语法错误:算术运算符无效(错误标记为“.5+1”) 我确

有没有办法处理Bash算术运算的错误?例如,尝试不受支持的浮点操作会导致错误:

$echo$((3.5+1))
-bash:3.5+1:语法错误:算术运算符无效(错误标记为“.5+1”)
我尝试使用逻辑OR或仅通过使输出静音来解决错误,但没有产生任何差异:

$echo$((3.5+1))||正确
-bash:3.5+1:语法错误:算术运算符无效(错误标记为“.5+1”)
$echo$((3.5+1))2>&-
-bash:3.5+1:语法错误:算术运算符无效(错误标记为“.5+1”)
我确实看到了这两种回退机制实际上是如何应用于
echo
而不是算术运算本身的,并且是后者引发了错误


有没有一种方法可以写一个或另一个,这样它们就可以应用于算术运算?

如果表达式的计算结果从来都不是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"

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

echo $(( 3.5 + 1)) 2>/dev/null
不幸的是,这不起作用。我猜这是因为错误消息来自Bash本身。但是,这确实有效(至少在Bash4.2上是这样):

(…)
创建了一个子shell,在某些平台(尤其是Cygwin和WSL)上成本非常高。这段稍微混乱的代码也可以工作,并且不会创建子shell:

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

问题是shell本身在解析命令时,在尝试计算语法正确的算术表达式之前,会引发错误。解决方法是首先不要写不好的表达式。如果表达式是硬编码的,那就很简单了。如果
3.5
是由于使用了参数扩展,如
$((v+1))
,那么在尝试使用算术表达式之前,您需要验证
v
的值。看起来您的根本问题是需要一个能够处理浮点数的bash运算符。你试过卑诗省吗?只是想知道为什么到目前为止没有人接受答案。对我来说似乎很完美。如果它不能解决你的问题,你可能想解释一下原因,以便其他人能给你你需要的答案。
{ echo $(( 3.5 + 1)) ; } 2>/dev/null