2016-08-01 60 views
0

Hier ist der Code:Variable ist verketten, nicht in BASH Inkrementieren

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

Hier wird der Befehl:

$ bash MyScript.sh duck duck goose 

Hier ist der Ausgang:

duck 
01 
duck 
011 
goose 
0111 

So scheint es (für mich) die Variable v als String oder nicht als Integer zu behandeln. Ich bin nicht sicher, warum es das tun würde und ich denke, dass dies ein einfaches Problem ist, dass ich nur ein kleines Detail übersehen habe.

Ist dies ein Beispiel für die Fallstricke der nicht statischen Typisierung?

Danke,

+0

Kurzform: Zeichenfolgen sind der Standardtyp für * alles * in bash. –

Antwort

0

Verwenden Sie einen mathematischen Kontext, um Mathe durchzuführen. Die bash-spezifische Syntax hierfür ist (()):

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

Alternativ kann eine POSIX-kompatible Syntax für einen mathematischen Zusammenhang $(()):

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

... oder ...

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

Es gibt auch die Nicht-POSIX-konforme let Operation:

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

... und die in ähnlicher Weise nicht-POSIX-konform 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

Völlig vergessen, danke! Danke für den Titelgewinn. Meine Autokorrektur hat falsch geraten :) – Josafoot

0

Bash tut das nicht. Sie haben die mathematische Operation Syntax $((...)), nämlich zu verwenden:

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

Ausgabe von bash <file> duck duck duck goose:

duck 
1 
duck 
2 
duck 
3 
goose 
4 
+0

btw, 'für var in" $ @ "; do 'könnte auch geschrieben werden als 'für var; mach es. –

0

nur hinzufügen typeset -i v zu Ihrem Shell:

Beispiel:

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

gibt

13 
+0

Das funktioniert, aber ich würde es nicht als gute Praxis bezeichnen: Es macht Ihren Code schwerer lesbar, weil man den Kontext kennen muss, um zu wissen, wie man ihn interpretiert. –

+0

Im Gegensatz zu '$ (())' ist dies ein Bashism und wird nicht bei allen POSIX-Shells funktionieren. –