変数が 0 に設定されている場合、増分演算子は変数に対して機能しません。

変数が 0 に設定されている場合、増分演算子は変数に対して機能しません。

varbash では、 のように二重括弧で囲むと変数を増分できます(( 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

誰かこの動作を説明できますか?

環境:

Ubuntu Desktop 18.04.5 LTS で gnome-terminal を使用しています。

答え1

クレジットはここから:https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

((式)) の戻り値はエラー状態を示しませんが、bash のマニュアルページから引用すると次のようになります。

((expression)) 式は、以下の算術評価で説明する規則に従って評価されます。式の値がゼロ以外の場合、戻りステータスは 0 になります。それ以外の場合は、戻りステータスは 1 になります。これは、let "expression" とまったく同じです。

では、ポスト増分を行っています。の((a++))値が返され、その後、増分されます。a01

比較する

$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1

$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1

事前増分なので、aになり10返されます。

答え2

これは私の場合(bashUbuntuでは)うまくいきました。

$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4

違いに注目してください

$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3

関連情報