+=がスクリプトで接続として使用されるのはなぜですか?
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
など。
このトピックについて拡張された議論があります。ここ。