Wie teile ich in der Linux-Konsole?


70

Ich muss Variablen und ich möchte den Wert von einem geteilt durch den anderen finden. Welche Befehle soll ich dazu verwenden?



1
Hat das wirklich mit der Programmierung zu tun? [ stackoverflow.com/faq]
Frank V

1
@ frank-v Bash kann zum Programmieren verwendet werden ... auch, dass der Link zur FAQ nicht funktioniert
chomp

Antworten:


68

Umgeben Sie in der Bash-Shell arithmetische Ausdrücke mit $(( ... ))

$ echo $(( 7 / 3 ))
2

Obwohl ich denke, dass Sie auf ganze Zahlen beschränkt sind.


10
Ja, Bash ist auf ganzzahlige Mathematik beschränkt.
mkb

39
echo 5/2 | bc -l

2.50000000000000000000

Diese Option '-l' in 'bc' ermöglicht schwebende Ergebnisse


3
Cool; Mit erhalten -lSie standardmäßig 20 Dezimalstellen und es wird eine Mathematikbibliothek geladen, die zusätzliche Funktionen wie Sinus definiert. Um die Anzahl der Dezimalstellen explizit anzugeben, stellen Sie dem Ausdruck scale={numPlaces};(auch) voran, wie in der Antwort von @ user1504475 gezeigt. Mit anderen Worten: Dies -list eine bequeme Alternative zur Angabe scale=20;, verursacht jedoch Leistungskosten aufgrund des Ladens der Bibliothek. Die tatsächlichen Auswirkungen scheinen jedoch vernachlässigbar zu sein.
mklement0

16

Besser ist es, "bc" zu verwenden, einen beliebigen Präzisionsrechner.

variable=$(echo "OPTIONS; OPERATIONS" | bc)

Ex:

my_var=$(echo "scale=5; $temp_var/100 + $temp_var2" | bc)

wobei "scale = 5" die Genauigkeit ist.

man bc 

kommt mit mehreren Anwendungsbeispielen.


1
Cool; Eine Sache, die Sie beachten sollten: Setzen scaleSie die -lStandardeinstellungen nicht auf Ganzzahldivision - es sei denn, Sie geben an , wie @raytrace unten feststellt, dass Sie anscheinend standardmäßig 20 Dezimalstellen erhalten, aber auch eine Bibliothek mit zusätzlichen Funktionen laden.
mklement0

11

Ich bevorzuge immer noch die Verwendung von DC , einem RPN-Rechner. Eine schnelle Sitzung zum Teilen von 67 durch 18 mit 4-stelliger Genauigkeit würde also aussehen

>dc
4k
67
18/p
3.7222
q
>

Offensichtlich viel mehr verfügbar: man dc


4
Ein paar Hinweise, um möglicherweise eine Reise zu sparen man: RPN = Reverse Polish Notation; Kurz gesagt: Sie geben zuerst die Operanden und dann den Operator ein. Eine Beendigung pist erforderlich, um das Ergebnis auszugeben. Die nicht interaktive Version der obigen Berechnung lautet : dc -e '4k 67 18 / p'. Vorsichtsmaßnahme: Die Genauigkeit (mit {numPlaces}k) wird nicht auf 0 gesetzt, dh auf eine ganzzahlige Division.
mklement0

11

Sie können awk verwenden , ein Dienstprogramm / eine Sprache für die Datenextraktion

zB für 1.2 / 3.4

>echo 1.2 3.4 | awk '{ print $2/$1 }'
0.352941

8

In Bash können Sie Folgendes tun, wenn Sie in Ihrer Abteilung keine Dezimalstellen benötigen:

>echo $((5+6))
11
>echo $((10/2))
5
>echo $((10/3))
3

5

Ich gehe davon aus, dass Sie mit Linux-Konsole Bash meinen .

Wenn Xund Ysind Ihre Variablen, gibt $(($X / $Y))zurück, wonach Sie fragen.


1
Sie brauchen die $ nicht für die Variablen
Draemon

2

Beispiel für eine ganzzahlige Division mit bash, um $ a durch $ b zu teilen:

echo $((a/b))

2

Etwas anderes könnten Sie mit der Antwort von raytrace tun. Sie können die Standardausgabe eines anderen Shell-Aufrufs mithilfe von Backticks verwenden, um dann einige Berechnungen durchzuführen. Zum Beispiel wollte ich die Dateigröße der Top 100 Zeilen aus einigen Dateien wissen. Die ursprüngliche Größe von wc -cist in Bytes, ich möchte Kilobyte wissen. Folgendes habe ich getan:

echo `cat * | head -n 100 | wc -c` / 1024 | bc -l

1

Sie sollten versuchen zu verwenden:

echo "scale=4;$variablename/3"|bc


-1

Ich hatte auch das gleiche Problem. Es ist einfach, Ganzzahlen zu teilen, aber Dezimalzahlen sind nicht so einfach. Wenn Sie 2 Zahlen wie 3.14 und 2.35 haben und die Zahlen dann teilen, lautet der Code Division = echo 3.14 / 2.35 | bc echo "$ Division". Die Anführungszeichen sind unterschiedlich. Seien Sie nicht verwirrt, es befindet sich direkt unter der Esc-Taste auf Ihrer Tastatur. DER EINZIGE UNTERSCHIED IST DER | bc und auch hier arbeitet echo als Operator für die arithmetischen Berechnungen anstelle des Druckens. Also hatte ich das Echo "$ Division" hinzugefügt, um den Wert zu drucken. Lassen Sie mich wissen, ob es für Sie funktioniert. Vielen Dank.


Die Anführungszeichen werden hier nicht angezeigt. Setzen Sie also einfach die Anführungszeichen (``) nach = und nach bc.
SHIBLI

Das sind keine Zitate. Sie sind akute Akzente. Sie werden nicht angezeigt, da StackOverflow sie verwendet, um Code-Schnipsel hervorzuheben, some code heredie gerade in die akuten Akzente eingeschlossen wurden.
Chris Sharp
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.