如果存在`set -e`指令,为什么在Bash脚本中 ((0)) 会导致退出?

4
这将输出before\n
#!/usr/bin/env bash
set -e

echo before
((0))
echo after

移除set -e或将((0))更改为((1))会使程序按预期输出before\nafter\n

为什么((0))会触发set -e的退出条件?

2个回答

9
这将解释:
((0))
echo $?
1

((1))
echo $?
0

由于((和))中算术表达式的返回状态非零,当使用set -e时,您的脚本会退出。
正如help set所述:

-e 如果命令以非零状态退出,则立即退出。


2

1
如果一个命令以非零状态退出,则不适合。这就是为什么脚本退出的原因。 - Dr. Jan-Philip Gehrcke
在计算环境中,0 表示为假。假等于失败。这就是为什么 (( 0 ))(计算环境)和 (exit 0;)(标准退出状态环境)是不同的原因。 - Charles Duffy
是的,但在 shell 上下文中,0 表示成功。另一个答案显示 ((0)) 的计算结果为 1 == 失败。注意这种差异对于回答问题至关重要。也许这只是 @Dariusz 的笔误,至少我相信我们都同意 ((0)) 是一个计算结果为 0 的表达式 这一说法需要进一步解释才能理解。 - Dr. Jan-Philip Gehrcke
@Jan-PhilipGehrcke 谢谢,确实是个笔误。已经更正了。 - Dariusz
@Jan-PhilipGehrcke,是的,但将shell放入数字上下文中是(( ))的全部意义,这就是为什么将该表达式评估为退出状态1是shell实现正确的事情 - 它从数字上下文(内部)转换为shell上下文(外部)。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接