+=演算子が値を増加できないのはなぜですか?

+=演算子が値を増加できないのはなぜですか?

+=がスクリプトで接続として使用されるのはなぜですか?

while read t
do
    t+=2
echo $t

最後に2つ追加しましたが…なぜですか?

答え1

ほとんどのBourne様シェル(ksh、bash、zsh)では、+=演算子は3つの異なる変数タイプに対して機能します。

一般変数(文字列変数)の場合、次のことが発生します。

$ a=hello
$ a+=3
$ echo "$a"
hello3

変数が整数型として定義される場合、または演算が算術環境で実行される場合、演算子はC言語で一般的な意味を持ちます。

$ typeset -i a
$ a=31
$ a+=3
$ echo "$a"
34

または算術環境で:

$ unset a
$ a=31
$ let a+=3           # an odd example to make you think!!.
                     # better use ((a+=3))
                     # or, in a POSIX sh: [ $((a+=3)) -eq 0 ]
$ echo "$a"
34

また、+=配列に要素を追加するためにも使用されます(シェルに配列がある場合)。

$ unset a
$ a=()
$ a+=(one)
$ a+=(111)
$ printf '<%s> ' "${a[@]}"; echo
<one> <111>

したがって、元の質問に対する答えは次のようになります。

+=がスクリプトから接続として機能するのはなぜですか?

tこれは通常の文字列変数であるため、算術コンテキストの外部で使用されます。

答え2

機能豊富なPOSIX様シェル(ksh、mksh、Bash、zsh)では、演算子+=はい汎用スカラー変数で使用される文字列連結演算子です。あなたが見る結果は、あなたが期待していたものとまったく同じです。を増やすには、t次のようにします。

while read t; do
  (( t+=2 ))
  echo $t
done

または:

while read t; do
  t=$(( t+2 ))
  echo $t
done

など。

このトピックについて拡張された議論があります。ここ

関連情報