为什么以下代码段不起作用?
set -ue
inc=0
((inc++))
((inc++))
echo $inc
echo Here
[output nothing, return code 1]
但是当禁用' -e'它确实按预期工作?我使用" GNU bash,版本4.3.46(1) - 发布"
答案 0 :(得分:7)
因此(来自bash
手册页):
((表达式))
根据下述规则评估表达式 在算术评估下。如果表达式的值是 非零,返回状态为0;否则返回状态为1。 这完全等同于让“表达”。
所以当inc
为0
并且您运行时:
((inc++))
...表达式的值为0
(因为您使用的是后缀++
运算符),因此返回值为1
,这意味着您的脚本退出当-e
生效时。解决此特定问题的最简单方法是使用前缀++
运算符:
set -ue
inc=0
((++inc))
((++inc))
echo $inc
echo Here
<强>更新强>
正如@cdarke所提到的,您可以使用:
命令,这是一个特殊的shell命令,意味着“除了评估所有参数之外什么都不做”。您将经常在shell脚本中遇到这种情况,它用于变量默认值,如下所示:
: ${SOMEVAR:=somevalue}
或在while
循环中,如下所示:
while :; do
...
done
所以而不是:
((inc++))
你可以这样做:
: $((inc++))
但是你会发现有两处变化(这就是为什么我在原来的答案中没有提到它)。由于:
本身就是一个命令,因此您不能再使用((...))
语法(这与let
命令完全等效)。相反,您需要使用算术表达式语法$((...))
。
您也可以这样做:
((inc++)) || true
甚至:
((inc++)) || :
同样具有从表达式中抑制错误返回码的效果。