a-=2コマンドが失敗するのはなぜですか?

a-=2コマンドが失敗するのはなぜですか?

コマンドを実行した後、コマンドはdeclare -i a=5成功a+=2しますが、コマンドはa-=2失敗します。誰かがbashの奇妙な動作を説明できますか?

答え1

Bashにはデフォルトのシェル構文に-=代入演算子はありません(算術コンテキストは異なります。以下を参照)。つまり、=変数に代入を使用したり、非整数変数に追加したり、整数変数に追加したりできますが、+=これには関係ありません。 Bashで構文を借りたKshでも同様です(この場合は他の多くの場合と同様)。 Zshも同様の機能を持っています。-=*=

他の組み合わせ割り当て演算子は、+=とにかく整数ではない変数にはあまり意味がなく、一般的な「文字列」変数が最も一般的な変数なので、基本構文でこれらの演算子を使用することはおそらく価値がありません。特にvar*=123それは球体であり、var/=123パスのように見えるからです。しかし、私が言ったように、+=この整数ではない場合はうまくいきます。

$ foo=123; foo+=456; echo $foo
123456

-=いつものように、マニュアルはこれについて少し簡単に説明し、欠落による欠陥のみを文書化します。部分3.4 シェルパラメータ変数の割り当ては説明され、言及されていますが、+=他には何もありません。

もちろん、算術的な文脈では($(( .. ))etc。(( .. )))、などすべて可能です+=-=*=:

$ foo=456; (( foo -= 123 )); echo $foo
333

答え2

Bashでは算術評価が内部的に行われます(( ))((i=i+3))~からBashのマニュアルページ(man bash

((表現する))

式は、以下の算術評価で説明されている規則に従って評価されます。

-=どちらも+=算術評価セクションに文書化されており、= *= /= %= <<= >>= &= ^= |=どちらも期待どおりに機能します。 もし算術記号を使用します。

+=この記号なしでの作業は、マニュアルのパラメータセクションで説明されている例外です。

整数属性が設定された変数に+ =を適用すると、値は算術式として評価され、変数の現在の値に追加され、この値も評価されます。

おおむね所望の動作を得るために

#!/bin/bash
declare -i a=5
((a+=2))
echo $a
((a-=2))
echo $a

出力は7と5です。

答え3

+=Bashは、属性が整数型に設定された変数と共に使用されるときに暗黙的な算術計算を許可しますdeclare -i。それ以外の場合は、-i「追加」操作の代わりに「追加」操作を実行するようにシェルに指示します。あるいは、他の演算子は、算術コンテキストで使用される場合を除いて-=特別な意味を持ちません。

GNU bashのマニュアルページから抜粋したものをご覧ください。

+=整数プロパティが設定された変数に適用されると、値は算術式として評価され、変数の現在の値に追加され、この値も評価されます。

declare -i var=2
var+=2
printf '%d\n' "$var"
4

いいえ-i

declare foo=zoo
foo+=2
printf '%s\n' "$foo"
zoo2

他の演算子の場合*=、、、、、、、、が内部的にサポートされます。/=%=-=<<=>>=&=^=|=$((..))

foo=144; (( foo /= 12 )); printf '%d\n' "$foo"
12

+=配列と共に使用する際の別の動作は、最初のインデックスの要素に文字列をarr+=foo追加することです。fooarr+=(foo) 追加foo配列で使用可能な次のインデックスの新しい要素。

答え4

他の回答に関する注意事項なぜ a-=2動作しません(そして((a-=2)) 〜する働く)。私もこれがうまくいくa+=-2ことを文書化する価値があると思います:

$ declare -i a=5
$ echo $a
5
$ a+=2
$ echo $a
7
$ a+=-2
$ echo $a
5

関連情報