Wie übergebe ich die Ergebnisse von bc an eine Variable?

15

Ich schreibe ein Skript und möchte die Ergebnisse von bcin eine Variable übergeben. Ich habe 2 Variablen ( var1und var2) deklariert und ihnen Werte gegeben. In meinem Skript möchte ich die Ergebnisse von bcan eine andere Variable übergeben, var3damit ich mit ihnen var3für andere Berechnungen arbeiten kann. Bisher konnte ich das Ergebnis in eine Datei schreiben, die nicht das ist, wonach ich suche, und ich konnte das Ergebnis im Terminal wiedergeben, aber ich möchte das Ergebnis im Moment nur an eine Variable übergeben, damit Ich kann mit dieser Variablen arbeiten.

echo "scale=2;$var1/var2" | bc
Shaolin
quelle

Antworten:

23

Wenn Sie bash verwenden, verwenden Sie besser einen Here-String anstelle einer Pipe wie in:

bc <<< "scale=2;$var1/$var2"

Dies erspart Ihnen eine Unterschale.

Verwenden Sie dann eine Befehlsersetzung, um die Ausgabe eines Befehls zu speichern:

answer=$(bc <<< "scale=2;$var1/$var2")

Bearbeiten.

Wenn Sie etwas noch cooleres als wollen bc, hier ist DC (Reverse Polish Calculator):

answer=$(dc <<< "2k $var1 $var2/p")
gniourf_gniourf
quelle
1
Ja, ich verwende Bash. Kannst du das bitte in der Unterschale klären? Gibt es einen Nachteil?
Shaolin
2
Jedes Mal, wenn Sie eine Pipe verwenden, wird |der Befehl auf der rechten Seite der Pipe in einer Subshell ausgeführt. Das Öffnen einer neuen Subshell erfordert Ressourcen (dies entspricht dem Öffnen einer neuen Instanz von bash, um diesen Befehl auszuführen). Wenn Sie es vermeiden können, vermeiden Sie es. In diesem Fall wird der Befehl mit Piping an echoto in einer Subshell ausgeführt und ist in gewisser Weise verzögert (keine Beleidigung), da bash das wunderbare Here-String-Konstrukt hat , um solche dummen Dinge zu vermeiden. bcbc<<<
gniourf_gniourf
@gniourf_gniourf Andererseits, wenn Sie sich um die Ressourcennutzung gekümmert haben, würden Sie /bin/sh(dash) anstelle von bash verwenden, aber dash hat dies nicht <<<.
Gilles 'SO- hör auf böse zu sein'
Vielen Dank für die hilfreichen Informationen !! Dies sind gute Informationen, um Ressourcen und Unterschalen zu schonen. Ich schätze Ihre Eingabe sehr.
Shaolin
1
@ Gilles vergleichen Sie einfach time for i in {1..10000}; do : <<< ""; donemit time for i in {1..10000}; do echo "" | : ; done, Sie werden einen dramatischen Unterschied sehen. Dann hast du recht, ein Heredoc ist etwas schneller als ein Herestring. Es ist jedoch umständlicher, als Einzeiler zu schreiben.
gniourf_gniourf
8

Die Befehlsersetzung speichert die Ausgabe eines Befehls in einer Variablen.

var3=$(echo "scale=2;$var1/$var2" | bc)
Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank! Dies brachte mich genau dahin, wo ich sein wollte, nachdem ich wahrscheinlich eine Stunde recherchiert hatte. Danke
Shaolin