コマンドを実行した後、コマンドは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
追加することです。foo
arr+=(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