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

nea*_*llp 1 shell scripting

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

while read t
do
    t+=2
echo $t
Run Code Online (Sandbox Code Playgroud)

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

Qua*_*tal 17

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

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

$ a=hello
$ a+=3
$ echo "$a"
hello3
Run Code Online (Sandbox Code Playgroud)

如果变量定义为整数类型,或者运算在算术环境中执行,则运算符具有 C 语言中的通常含义:

$ typeset -i a
$ a=31
$ a+=3
$ echo "$a"
34
Run Code Online (Sandbox Code Playgroud)

或者在算术环境中:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • [而不是 let expr,更喜欢 (( expr ))](https://www.shellcheck.net/wiki/SC2219) (4认同)