如果变量设置为 0,则增量运算符对变量不起作用

Saa*_*aad 6 command-line bash

var在 bash 中,当用双括号(如(( var++ )). 但我发现如果变量事先设置为 0 ,它就会失败var=0

$ a=0
$ ((a++)) && echo "command succeeded" || echo "command failed"
command failed

$ a=1
$ ((a++)) && echo "command succeeded" || echo "command failed"
command succeeded

Run Code Online (Sandbox Code Playgroud)

有人可以解释这种行为吗?

环境:

我在 Ubuntu 桌面 18.04.5 LTS 上使用 gnome-terminal。

van*_*ium 10

来自这里的信用: https: //unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

(( expression )) 的返回值并不指示错误状态,但是,从 bash 联机帮助页来看:

((表达式)) 表达式根据下面算术评估中描述的规则进行评估。如果表达式的值非零,则返回状态为0;否则返回状态为1。这与let“表达式”完全相同。

你正在((a++))做一个后期增量。的值a因此01返回,之后递增。

比较

$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1
Run Code Online (Sandbox Code Playgroud)

相对

$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1
Run Code Online (Sandbox Code Playgroud)

预增量,因此a已成为1并被0返回。


sud*_*dus 6

这对我有用(在bashUbuntu 中),

$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4
Run Code Online (Sandbox Code Playgroud)

注意与的区别

$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3
Run Code Online (Sandbox Code Playgroud)

  • 检查“回显$?”。 (2认同)
  • @pLumo,echo $((a++)) 在更新之前打印,echo $((++a)) 在更新之后打印。 (2认同)