Ich habe dieses Bash-Skript und ich hatte ein Problem in Zeile 16. Wie kann ich das vorherige Ergebnis von Zeile 15 nehmen und zu der Variablen in Zeile 16 hinzufügen?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Für ganze Zahlen:
Verwenden Sie arithmetische Erweiterung: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # funktioniert auch
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # alte, veraltete Syntax für arithmetische Ausdrücke
Verwendung des externen Programms expr
. Beachten Sie, dass dies nur für wirklich alte Systeme erforderlich ist.
num=`expr $num1 + $num2` # Whitespace für expr ist wichtig
Für Fließkomma:
Die Bash unterstützt dies nicht direkt, aber es gibt ein paar externe Tools, die Sie verwenden können:
num=$(awk "BEGIN {print $num1+$num2; exit}")
num=$(python -c "print $num1+$num2")
num=$(perl -e "print $num1+$num2")
num=$(echo $num1 + $num2 | bc) # whitespace for echo is important
Sie können auch die wissenschaftliche Notation verwenden (z.B.: 2.5e+2
)
Gängige Fallstricke:
Wenn Sie eine Variable setzen, dürfen Sie keine Leerzeichen auf beiden Seiten von =
haben, sonst wird die Shell gezwungen, das erste Wort als den Namen der auszuführenden Anwendung zu interpretieren (z.B.: num=
oder num
)
num= 1
num =2
bc
und expr
erwarten jede Zahl und jeden Operator als ein separates Argument, daher ist das Leerzeichen wichtig. Sie können keine Argumente wie 3+
+4
verarbeiten.
num=`expr $num1+ $num2
Verwenden Sie die arithmetische Erweiterung $(( ))
.
num=$(( $num + $metab ))
Siehe http://tldp.org/LDP/abs/html/arithexp.html für weitere Informationen.
Es gibt tausend und eine Möglichkeit, dies zu tun. Hier's eine, die dc
verwendet:
dc <<<"$num1 $num2 + p"
Aber wenn dir das zu plump ist (oder die Portabilität wichtig ist), könntest du sagen
echo $num1 $num2 + p | dc
Aber vielleicht gehören Sie ja zu den Leuten, die RPN für eklig und seltsam halten; keine Sorge! bc
ist für Sie da:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Abgesehen davon gibt es ein paar Verbesserungen, die Sie an Ihrem Skript vornehmen könnten
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in output-$i-* ; do # for can glob directly, no need to ls
echo "$j"
# grep can read files, no need to use cat
metab=$(grep EndBuffer "$j" | awk '{sum+=$2} END { print sum/120}')
num=$(( $num + $metab ))
done
echo "$num"
done
EDIT:
Wie in BASH FAQ 022 beschrieben, unterstützt die Bash von Haus aus keine Fließkommazahlen. Wenn Sie Fließkommazahlen summieren müssen, ist die Verwendung eines externen Tools (wie bc
oder dc
) erforderlich.
In diesem Fall würde die Lösung lauten
num=$(dc <<<"$num $metab + p")
Möglicherweise Fließkommazahlen in num
zu akkumulieren.