变量是连接的,而不是在BASH中递增

时间:2016-08-01 16:24:06

标签: bash variables integer typing

以下是代码:

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视为字符串或不是整数。我不确定为什么会这样做,我觉得这是一个简单的问题,我只是忽略了一个小细节。

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

谢谢,

3 个答案:

答案 0 :(得分:0)

使用数学上下文执行数学运算。特定于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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

示例:

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

给出

13