为什么 += 在脚本中用作串联?
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。
关于这个话题有一个扩展的讨论这里。