启用错误选项时,无法在Bash中使用递增操作

时间:2016-11-05 13:48:32

标签: bash

为什么以下代码段不起作用?

set -ue

inc=0
((inc++))
((inc++))
echo $inc
echo Here
[output nothing, return code 1]

但是当禁用' -e'它确实按预期工作?我使用" GNU bash,版本4.3.46(1) - 发布"

1 个答案:

答案 0 :(得分:7)

因此(来自bash手册页):

  

((表达式))

     

根据下述规则评估表达式   在算术评估下。如果表达式的值是   非零,返回状态为0;否则返回状态为1。   这完全等同于让“表达”。

所以当inc0并且您运行时:

((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++)) || :

同样具有从表达式中抑制错误返回码的效果。