2012-11-29 7 views
6

Wie soll ich eine Zahl nehmen, die in Hundertstel Sekunden ist und sie in Sekunden auf zwei Dezimalstellen anzeigen? Psuedo-Code, um der dTime-Funktion zu folgen, bin ich mir nicht sicher, aber Sie werden bekommen, was ich anstrebe, denke ich.Wie die Zahl auf zwei Dezimalstellen in der Bash-Funktion angezeigt wird

function time { 
    echo "$(date +%N)/10000000" 
} 

function dTime { 
    echo "($1/100).(${$1:${#1}-3:${#1}-1})" 
} 

T=$time 
sleep 2 
T=$dTime T 
+0

bash führt nur Integer-Arithmetik. Ihre Frage ist etwas irreführend, da Sie sich fragen, ob Sie eine Zahl auf zwei Dezimalstellen setzen möchten, und der Code, den Sie anzeigen, führt die Gleitkommaarithmetik eindeutig aus. –

+0

Verwenden Sie [printf] [1] und huckepack auf lang getestetem Code. [1]: http://stackoverflow.com/questions/4377871/sprintf-in-shell-scripting –

Antwort

20

heftiger Schlag hat eine Funktion printf eingebaut:

printf "%0.2f\n" $T 
+1

Beachten Sie, dass printf auf locales Einstellungen ab! In Fr zum Beispiel wird ',' im Gebietsschema für die Float-Trennung verwendet, nicht '.'. Also in Fr, printf "% 0.2f \ n" 26.600 wird einen Fehler zurückgeben (die Zahl muss als "26.600" ausgedrückt werden) – brunetton

4

Nachfolgend teilt die Ausgabe von date +%N durch 1000000000, rundet das Ergebnis auf zwei Dezimalstellen und weist das Ergebnis der Variablen T.

printf -v T "%.2f" $(bc -l <<< "$(date +%N)/1000000000") 

Wenn Sie nur das Zeug ausdrucken möchten,

bc <<< "scale=2; $(date +%N)/1000000000" 

Wenn Sie nicht bc mögen und wollen dc verwenden (was ein bisschen leichter und viel lustiger verwenden, wie es ist Reverse Polish),

dc <<< "2 k $(date +%N) 1000000000/p" 

Beachten Sie den Unterschied mit printf erhalten Sie die führende 0 haben, nicht mit bc und dc. Es gibt einen weiteren Unterschied zwischen printf und bc (oder dc): printf Runden auf die nächste Zahl mit zwei Dezimalstellen, während bc (oder dc) Runden richtig auf zwei Dezimalstellen. Wenn Sie das letztere Verhalten wollen und auf eine Variable T das Ergebnis zuordnen, können Sie verwenden beispielsweise

T=$(dc <<< "2 k $(date +%N) 1000000000/p") 

oder, wenn Sie auch die führende 0 wollen:

T=0.$(dc <<< "2 k $(date +%N) 1000000000/p") 
Verwandte Themen