
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
誰かこの動作を説明できますか?
環境:
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++))
値が返され、その後、増分されます。a
0
1
比較する
$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1
対
$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1
事前増分なので、a
になり1
、0
返されます。
答え2
これは私の場合(bash
Ubuntuでは)うまくいきました。
$ 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