2016-08-01 59 views
0

这里不递增是代码:变量被串联,在BASH

v=0 
for var in "[email protected]";do 
     echo $var 
     v+=1 
     echo $v 
done 

这里是命令:

$ bash MyScript.sh duck duck goose 

这里是输出:

duck 
01 
duck 
011 
goose 
0111 

所以它出现(对我来说)将变量v当作字符串或不是整数。我不知道为什么会这样做,我觉得这是一个简单的问题,我只是忽略了一个小细节。

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

谢谢,

+0

short form:strings是* everything *在bash中的默认类型。 –

回答

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 
+0

完全忘了那些谢谢!感谢您抓住标题。我的自动更正猜测错了:) – Josafoot

0

猛砸没有做到这一点。您必须使用数学运算语法$((...)),即:

输出 bash <file> duck duck duck goose
v=0 
for var in "[email protected]";do 
    echo $var 
    v=$((v+1)) 
    echo $v 
one 

duck 
1 
duck 
2 
duck 
3 
goose 
4 
+0

btw,'var for“$ @”;做'也可以写成'var; do'。 –

0

只需添加typeset -i v到shell:

例如:

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

给出

13 
+0

这是有效的,但我不会说它是好的做法:它会让你的代码难以阅读,因为必须知道上下文才能知道如何解释它。 –

+0

另外,不像'$(())',这是一种双击操作,并不适用于所有POSIX shell。 –