变量是串联的,而不是递增 BASH

Variable is concatenating, not incrementing in BASH

代码如下:

v=0
for var in "$@";do
        echo $var
        v+=1
        echo $v
done

命令如下:

$ bash MyScript.sh duck duck goose

这是输出:

duck
01
duck
011
goose
0111

因此(对我而言)似乎将变量 v 视为字符串或非整数。我不确定为什么会这样做,我觉得这是一个简单的问题,我只是忽略了一个小细节。

这是非静态类型陷阱的一个例子吗?

谢谢,

使用数学上下文进行数学运算。 bash 特定的语法是 (( )):

(( v += 1 )) # not POSIX compliant, not portable

或者,符合 POSIX 的数学上下文语法是 $(( )):

v=$(( v + 1 )) # POSIX-compliant!

...或...

: $(( v += 1 )) # POSIX-compliant!

还有不符合POSIX的let操作:

let v+=1 # not POSIX compliant, not portable, don't do this

...以及类似的不符合POSIX的declare -i:

declare -i v # not POSIX compliant, not portable, don't do this
             # ...also makes it harder to read or reuse snippets of your code
             # ...by putting action and effect potentially further from each other.
v+=1

Bash 不会那样做。您必须使用数学运算语法 $((...)),即:

v=0
for var in "$@";do
    echo $var
    v=$((v+1))
    echo $v
one

bash <file> duck duck duck goose 的输出:

duck
1
duck
2
duck
3
goose
4

只需将 typeset -i v 添加到您的 shell:

示例:

typeset -i v
v=12
v+=1
echo $v

给予

13