以下是代码:
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视为字符串或不是整数。我不确定为什么会这样做,我觉得这是一个简单的问题,我只是忽略了一个小细节。
这是非静态类型陷阱的一个例子吗?
谢谢,
答案 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