Ich habe dieses Bash-Skript und hatte ein Problem in Zeile 16. Wie kann ich das vorherige Ergebnis von Zeile 15 nehmen und es 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
Antworten:
Für ganze Zahlen :
Verwenden Sie die arithmetische Erweiterung :
$((EXPR))
Verwenden des externen
expr
Dienstprogramms. Beachten Sie, dass dies nur für wirklich alte Systeme benötigt wird.Für Gleitkomma :
Bash unterstützt dies nicht direkt, aber es gibt einige externe Tools, die Sie verwenden können:
Sie können auch die wissenschaftliche Notation verwenden (z. B.
2.5e+2
).Häufige Fallstricke :
Wenn Sie eine Variable festlegen, darf auf keiner Seite ein Leerzeichen
=
stehen. Andernfalls wird die Shell gezwungen, das erste Wort als Namen der auszuführenden Anwendung zu interpretieren (z. B.num=
odernum
).num= 1
num =2
bc
undexpr
erwarten Sie jede Zahl und jeden Operator als separates Argument, daher ist Leerzeichen wichtig. Sie können Argumente wie nicht verarbeiten3+
+4
.num=`expr $num1+ $num2`
quelle
num1
undnum2
existierten und ganzzahlige Werte hatten?$((..))
arithmetische Auswertung wird in Bash ausgeführt.expr
wird als separater Prozess ausgeführt, daher wird es viel langsamer. Verwenden Sie letzteres auf Systemen, auf denen die arithemtische Auswertung nicht unterstützt wird (sh! = bash)$((…))
es von POSIX standardisiert wird, sollte es immer seltener werden,expr
was notwendig ist.Verwenden Sie die
$(( ))
arithmetische Erweiterung.Weitere Informationen finden Sie in Kapitel 13. Arithmetische Erweiterung .
quelle
191.003 + 190
.Es gibt tausend und eine Möglichkeit, dies zu tun. Hier ist eine Verwendung
dc
(ein Reverse-Polish-Tischrechner, der Arithmetik mit unbegrenzter Genauigkeit unterstützt):Aber wenn Ihnen das zu schüchtern ist (oder wenn es um Portabilität geht), können Sie sagen
Aber vielleicht gehören Sie zu den Leuten, die RPN für eklig und komisch halten. Mach dir keine Sorgen!
bc
ist für dich da:Es gibt jedoch einige unabhängige Verbesserungen, die Sie an Ihrem Skript vornehmen könnten:
Wie in Bash FAQ 022 beschrieben , unterstützt Bash Gleitkommazahlen nicht nativ. Wenn Sie Gleitkommazahlen summieren müssen, verwenden Sie ein externes Werkzeug (wie
bc
oderdc
) erforderlich.In diesem Fall wäre die Lösung
Zum Hinzufügen von akkumulierten Gleitkommazahlen in
num
.quelle
In Bash,
Beachten Sie, dass bash nur Ganzzahlarithmetik verarbeiten kann. Wenn Ihr Befehl awk also einen Bruch zurückgibt, sollten Sie ihn neu gestalten: Hier ist Ihr Code, der ein wenig umgeschrieben wurde, um alle Berechnungen in awk durchzuführen.
quelle
Ich vergesse immer die Syntax, also komme ich zu Google, aber dann finde ich nie die, mit der ich vertraut bin: P. Dies ist das sauberste für mich und entspricht mehr dem, was ich in anderen Sprachen erwarten würde.
quelle
quelle
Ich mag diese Methode auch sehr, weniger Unordnung:
quelle
Sie sollten metab als Ganzzahl deklarieren und dann die arithmetische Auswertung verwenden
Weitere Informationen finden Sie unter https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
quelle
Eine weitere tragbare
POSIX
kompatible Methodebash
, die als Funktion.bashrc
für alle arithmetischen Operatoren der Bequemlichkeit definiert werden kann.und nenne es einfach in der Kommandozeile als,
Die Idee ist, den Eingabefeld-Separator (IFS) zu verwenden , eine spezielle Variable,
bash
die zum Teilen von Wörtern nach der Erweiterung und zum Teilen von Zeilen in Wörter verwendet wird. Die Funktion ändert den Wert lokal, um das Wortteilungszeichen als Summenoperator zu verwenden+
.Denken Sie daran, dass das
IFS
lokal geändert wird und sich NICHT auf das StandardverhaltenIFS
außerhalb des Funktionsumfangs auswirkt . Ein Auszug aus derman bash
Seite,Das
"$(( $* ))"
stellt die Liste der Argumente dar, die übergeben werden sollen, um geteilt zu werden,+
und später wird der Summenwert unter Verwendung derprintf
Funktion ausgegeben . Die Funktion kann erweitert werden, um auch anderen arithmetischen Operationen Spielraum zu geben.quelle
quelle
Verwenden Sie eine integrierte Shell
let
, ähnlich wie(( expr ))
Quelle: https://www.computerhope.com/unix/bash/let.htm
quelle