2016-07-21 16 views
0
#! /bin/bash 
sum=0 
for number in $* 
do 
    x=$((sum + number)) 
    echo $x 
done 

Ich versuche einfach, ein Skript namens "hinzufügen" zu erstellen, die bei der Ausführung Positionsparameter hinzufügen wird. Anstatt die Zahlen hinzuzufügen, zeigt es sie einfach so an, wie es normalerweise eine Schleife wäre. Z.B.Kann nicht herausfinden, wie man Arithmetik in einer Bash-Schleife (für)

$ add 1 2 3 4 5 6 
1 
2 
3 
4 
5 
6 

Was mache ich falsch?

+0

BTW, 'für Nummer in $ *' ist in der Regel ein Code riechen - es bringt dich in Schwierigkeiten mit Einträgen mit Leerzeichen, mit Einträgen, die als Klumpen interpretiert werden können, und in anderen Fällen. Wenn Sie keinen guten Grund haben, etwas anderes zu tun, verwenden Sie 'for number; do' oder 'für die Nummer in" $ @ "; do '(beide sind völlig äquivalent). Siehe auch http://shellcheck.net/, das wird dies automatisch für dich erkennen. –

Antwort

2

Sie aktualisieren nie sum. Meinst du das?

sum=0 
for number in "[email protected]"; do 
    sum=$((sum + number)) 
    echo "$sum" 
done 

(Die echo $sum geht außerhalb der Schleife, wenn Sie nur eine Endsumme wollen, anstatt eine laufende Summe, auf die Standardausgabe geschrieben.)

+0

Das hat perfekt funktioniert, ich hatte versucht, die Summe vorher zu aktualisieren, aber ich glaube, ich habe $ innerhalb der arithmetischen Klammern verwendet. Vielen Dank. –

+0

Der einzige Unterschied zwischen 'sum' und' $ sum' in '$ ((...))' ist, dass der erste Standard auf 0 steht, wenn er undefiniert ist, während letzterer zu einem Syntaxfehler führt. – chepner

+0

+1. Außerdem bin ich neugierig: Unter welchen Bedingungen führt '$ sum' zu einem Syntaxfehler in' $ ((...)) '? Ich testete 'unset x; echo $ (($ x + 1)) 'und es gibt nur' 1' zurück. – John1024