bash set -o errexit 问题还是变量递增的方式?

Mar*_*cel 3 shell bash shell-script

我有一个 shell 脚本,使用 set -e 递增变量,如下例所示:

$ var=0; echo $?
0
$ ((var++)); echo $?
1
$ ((var++)); echo $?
0
$ ((var++)); echo $?
0
$ echo $var; echo $?
3
0
$ bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later  <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.    
$
Run Code Online (Sandbox Code Playgroud)

脚本意外退出。问题是,在 MacBook 上本地运行完全相同的脚本时,它不会以相同的方式退出。运行上面的示例时,MacBook 上的 bash shell 的行为方式完全相同。

有谁知道这里发生了什么事吗?

Gil*_*il' 5

如果算术表达式的值非零,则算术命令成功。如果表达式的值为 0,则命令失败,状态为 1。这允许在测试中使用算术命令,因为 shell 算术表达式中的布尔运算符返回 0 表示 true,1 表示 false(如在 C 中)。例如

\n\n
if ((x==3)); then \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

之所以有效,是因为当等于 3 时((x==3))返回 0 ,否则返回 1。$x

\n\n

后缀增量运算符返回变量的旧值。因此,如果之前为零,((var++))则返回错误状态。var

\n\n

set -e告诉 shell 在第一个命令失败时退出。那里没有什么惊喜。

\n\n

为了避免可能合法地具有值 0 的算术表达式导致不必要的错误,请不要使用算术命令,而应使用带有算术表达式的普通赋值。

\n\n
var=$((var+1))\n
Run Code Online (Sandbox Code Playgroud)\n