2016-03-25 6 views
2
answer=$(echo $((length/1024)) | bc -l) 

Also Länge ist eine Variable, die einen Wert wie 2402267538. hat und es muss durch 1024 geteilt werden.Wie teilt man Gleitkommazahlen mit Variablen mit ganzzahligem Ergebnis?

dieser Ausführung wirft diesen Fehler

")syntax error: invalid arithmetic operator (error token is " 
+0

[Ihr comme (hier: https://stackoverflow.com/questions/36216164/how-to-divide-floating-point-numbers-using-variables-with-integer-result#comment60065970_36216323) wird durch ein "Carriage Return" -Zeichen verursacht (das Ende der Zeile in Windows) in Ihrem Text. Entfernen Sie sie aus der Variablen "length", damit alles ordnungsgemäß funktioniert. Vielleicht so: 'length = $ {length // [! - 0-9] /}' –

Antwort

0

Wenn Sie das tun:

echo $((length/1024)) | bc -l 

Sie haben bereits verloren den Teil hinter dem Komma vor bc -l als $((length/1024)) führen Integer-Division.

Sie können bc -l wie folgt verwenden:

length="2402267538" 
answer=$(bc -l <<<"scale=2; $length/1024") 
echo "$answer" 

2345964.39 

wenig ausführlicher mit awk:

answer=$(awk -v len=$length 'BEGIN{printf "%.2f\n", len/1024}') 
echo "$answer" 

2345964.39 

Oder diese:

answer=$(awk -v len=$length 'BEGIN{printf "%d\n", len/1024}') 
echo "$answer" 

2345964 
+0

Die erste Antwort, wirft einen Fehler wie diesen (standard_in) 1: illegales Zeichen:^M und die zweite Antwort behält zwei Dezimalwerte nach der Berechnung bei – Animesh

+0

[Hier ist eine funktionierende Demo beider Codefragmente] (http://ideone.com/Z9hojn) – anubhava

+0

Wenn Sie nicht auf 2 Dezimalstellen beschränken möchten, verwenden Sie: 'awk -v len = $ length 'BEGIN {printf "% f \ n", len/1024}' – anubhava

0

Umschalten auf ksh würde die Aufgabe vereinfachen:

$ length=2402267538 

$ answer=$((length/1024.00)) 
$ echo $answer 
2345964.392578125 

Eine Möglichkeit, mit awk:

$ answer=$(awk "BEGIN{printf(\"%f\n\",$length/1024);}") 
$ echo $answer 
2345964.392578 

Wenn Sie nur den ganzzahligen Teil des Ergebnisses müssen (funktioniert sowohl mit bash und ksh):

$ answer=$((length/1024)) 
$ echo $answer 
2345964 

Wenn Ihre Länge Variable a Gleitkommazahl, Sie können es so trimmen:

$ length=2402267538.12 
$ ilength=${length%%.*} 
$ answer=$((ilength/1024)) 
$ echo $answer 
2345964 
+0

mit der obigen Aussage, wie behalte ich nur den Wert vor dem Komma ?? – Animesh

+0

Verwenden Sie keine Shell-Variable in awk wie diese, übergeben Sie sie an awk mit '-v var =" $ var "' – anubhava

+0

@anubhava ich normalerweise nicht. Es ist jedoch nicht verboten, man muss nur vorsichtig sein. – jlliagre