2016-08-01 58 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。 –