2013-02-22 6 views
24

Ich habe ein Backup-Skript auf meinem Server, die Cron-Aufträge von Sicherungen, und sendet mir eine Zusammenfassung der gesicherten Dateien, einschließlich der Größe der neuen Sicherungsdatei. Als Teil des Skripts möchte ich die endgültige Größe der Datei durch (1024^3) teilen, um die Dateigröße in GB von der Dateigröße in Bytes zu erhalten.Floating Point Ergebnisse in Bash Integer-Division

Da Bash keine Fließkommaberechnung hat, versuche ich, Pipes zu BC zu verwenden, um das Ergebnis zu erhalten, aber ich bin über grundlegende Beispiele ratlos.

Ich habe versucht, den Wert von Pi zu einer Skala zu bekommen, aber

obwohl die folgenden Werke:

~ #bc -l 
bc 1.06.95 
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 
This is free software with ABSOLUTELY NO WARRANTY. 
For details type `warranty'. 
4/3 
1.33333333333333333333 
22/7 
3.14285714285714285714 
q 
0 
quit 

Eine nicht interaktive Version nicht funktioniert:

#echo $((22/7)) | bc 
3 

Dies funktioniert:

#echo '22/7' | bc -l 
3.14285714285714285714 

Aber ich muss Variablen verwenden. So tut es helfen, dass die folgende nicht funktioniert:

#a=22 ; b=7 
#echo $((a/b)) | bc -l 
3 

Ich bin offensichtlich etwas in der Syntax fehlt für Variablen in Bash verwendet und mit einigen ‚Zeiger‘ verwenden könnte, was ich falsch verstanden habe.

Wie DigitalRoss sagte, kann ich folgendes verwenden:

#echo $a/$b | bc -l 
3.14285714285714285714 

aber ich komplexe Ausdrücke wie verwenden kann nicht:

#echo $a/(($b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 
#echo $a/((b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 
#echo $a/((b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 

Kann mir jemand eine funktionierende korrekte Syntax für Gleitkomma-Ergebnisse immer mit komplizierte arithmetische Ausdrücke?

+0

Es ist möglich, bash z. Ganzzahlige Division mit Fließkomma-Ergebnissen: Siehe: http://stackoverflow.com/a/24431665/3776858 – Cyrus

Antwort

31

Gerade doppelte Anführungszeichen (") der Ausdruck:

echo "$a/($b - 34)" | bc -l 

Dann wird bash die $ Variablen erweitern und alles andere ignorieren und bc wird einen Ausdruck mit Klammern sehen:

$ a=22 
$ b=7 
$ echo "$a/($b - 34)" 
22/(7 - 34) 

$ echo "$a/($b - 34)" | bc -l 
-.81481481481481481481 
+0

Awesome. Ich habe nie gedacht, doppelte Anführungszeichen zu verwenden, um die Variablen zu erweitern. Vielen Dank! – Droidzone

+0

Mhhh? Anführungszeichen erweitern die Variablen nicht, erlauben dies aber. –

+0

Süße, ich hätte zu Python gewechselt, wenn ich darüber gestolpert wäre. – Gurubaran

7

Bitte beachten dass Ihr echo $((22/7)) | bc -l tatsächlich bash 22/7 berechnet und dann das Ergebnis an bc sendet. Die Ganzzahlausgabe ist daher nicht das Ergebnis von bc, sondern einfach die Eingabe von bc.

Versuchen Sie echo $((22/7)) ohne es an bc zu leiten, und Sie werden sehen.