为什么 += 运算符无法增加值?

为什么 += 运算符无法增加值?

为什么 += 在脚本中用作串联?

while read t
do
    t+=2
echo $t

我在末尾添加了 2...为什么?

答案1

在大多数类似 Bourne 的 shell(ksh、bash、zsh)中,+=运算符作用于三种不同的变量类型。

对于普通变量(字符串变量),会发生这种情况:

$ 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

并且,+=还用于将元素添加到数组(其中 shell 确实有数组)。

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

所以,你最初的问题的答案是:

为什么 += 在脚本中作为连接起作用?

是因为t是一个普通的字符串变量(在算术环境之外使用)。

答案2

在功能丰富的类 POSIX shell(ksh、mksh、Bash、zsh)中,+=操作符用于常规标量变量时的字符串连接运算符。您看到的结果正是您所期望的。如果你想增加t,你可以这样做:

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

或者:

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

ETC。

关于这个话题有一个扩展的讨论这里

相关内容