2012-04-10 14 views
3

Ich arbeite in BASH und ich habe gerade einen Idiot Moment. Ich habe ein Projekt, an dem ich arbeite, dass ich einige sehr einfache arithmetische Ausdrücke verwenden muss und ich habe gerade gemerkt, dass viele meiner Probleme damit zusammenhängen, dass meine Variablen nicht aktualisiert werden. Also habe ich einen grundlegenden Algorithmus zusammengestellt, der eine Variable um eine Variable mit einer while-Schleife erhöht, bis eine bestimmte Zahl erreicht ist.BASH Arithmetische Probleme

counter=1 
counter2=0 

while [[ counter2 < 10 ]]; do 
    counter2=$(($counter2+$counter)) 
    echo $counter 
    echo $counter2 
done 

Ich führe das Skript. Tut nichts. Ich habe die <-> nur für Kicks und eine Endlosschleife tritt mit einer wiederholten Ausgabe von:

1 
0 
1 
0 

Für immer und ewig, bis ich es stoppen. Es ist also offensichtlich, dass sich die Variablen nicht ändern. Warum? Ich fühle mich wie ein Idiot, weil es etwas Dummes sein muss, das ich übersehe. Und warum, wenn ich < habe, ist es auch keine Endlosschleife? Warum druckt es überhaupt nichts? Wenn counter2 immer weniger als 10 ist, warum geht es dann nicht für immer weiter?

Danke Leute im Voraus.

EDIT: Nun, ich erkennen, warum es nichts zum Ausgeben wurde, wenn der Scheck < ... Ich soll $counter2 wurde anstelle von nur counter2 den tatsächlichen Wert von counter2 zu bekommen. Aber jetzt ist es nur gibt:

1 
2 

Und das ist es ... Ich fühle mich wie so ein derp.

+0

while [[counter2 <10]]; oder während [[$ counter2 <10]]; –

Antwort

4

Wenn das alles bash (100% sicher) dann könnte man declare -i verwenden, um explizit Typ Ihrer Variablen gesetzt und dann wird der Code so einfach sein wie:

declare -i counter=1 
declare -i counter2=0 

while [[ $counter2 -lt 10 ]]; do 
    counter2=$counter2+$counter 
    echo $counter 
    echo $counter2 
done 

EDIT: In bash können Sie einen arithmetischen Vergleich mit doppelter Parnethese durchführen. So können Sie Ihr während geschrieben werden als:

while (($counter2 < 10)) ; do 
+0

Dies tut auch nichts, alle Ausgaben sind Ergebnisse bis zu 2 für 'counter2'. So sieht meine Ausgabe ungefähr genau so aus, wie ich sie nach meiner Bearbeitung gepostet habe:/ – RedMageKnight

+0

Nein, versuch es jetzt. Ich habe das Skript bearbeitet. Ich habe meinen ersten Beitrag nicht getestet. Ihre Zustandsprüfung muss ebenfalls geändert werden. –

+0

Das - das hat funktioniert>.> Ich dachte, wenn du doppelte Klammern verwendest, könntest du anfangen, die physischen Symbole anstelle der Akronyme für Dinge wie 'weniger als' und 'größer als' zu verwenden. Wann können Sie die Symbole dann verwenden? O.o – RedMageKnight

4

Verwenden Sie innerhalb des $((...)) nicht das Sigil ($).

counter2=$((counter2+counter)) 
+0

Sie benötigen das Sigil vor der Klammer, sonst beschwert es sich, dass es das Token benötigt. Oder vielmehr, es beklagt, dass '(' ist ein unerwarteter Token, und alles wird funky. – RedMageKnight

+0

Ja, vor dem parens, nicht drinnen. – Kevin

+0

Ah, okay - nun, ich habe das getan und es geht immer noch nur bis zu 2 für counter2>.> Ich verstehe einfach nicht, was ich vermissen könnte – RedMageKnight

1

In bash können Sie c-like for-Schleifen verwenden:

for ((counter2=0; counter2<10; counter2+=counter)) 
do 
    echo $counter": "$counter2 
done 

Oft werden Sie dieses Konstrukt attraktiver finden zu verwenden:

for counter2 in {0..9} 
do 
    echo $counter": "$counter2 
done 
Verwandte Themen