2010-06-03 8 views
5

Grüße!Bash-Skript: Geben Sie bc-Ausgabe Zahlenformat

Ich verwende bs, um einige Berechnungen in meinem Skript zu machen. Zum Beispiel:

bc 
scale=6 
1/2 
.500000 

für die weitere Verwendung in meinem Skript muss ich "0.500000" insted“0,500000" .

Könnten Sie mir bitte helfen, bc Ausgang Zahlenformat für meinen Fall zu konfigurieren?

Antwort

3

Schnell und schmutzig, da scale gilt nur für die Dezimalstellen und bc scheint keine sprintf -ähnliche Funktion zu haben:

$ bc 
scale = 6 
result = 1/2 
if (0 <= result && result < 1) { 
    print "0" 
} 
print result; 
+0

+1 für diese Lösung: keine Notwendigkeit, andere Werkzeuge zu verwenden, wie awk. –

1

Können Sie die bc Nutzung in ein wenig besser Kontext zu setzen? Wofür verwenden Sie die Ergebnisse von bc?

folgenden in einer Datei Gegeben genannt some_math.bc

scale=6 
output=1/2 
print output 

auf der Kommandozeile kann ich das hinzufügen tun nach einer Null:

$ bc -q some_math.bc | awk '{printf "%08f\n", $0}' 
0.500000 

Wenn ich nur die Ausgabezeichenfolge benötigt ein haben Null für Formatierungszwecke, würde ich awk verwenden.

2

ich hier glauben, wird Version der Funktion geändert:

float_scale=6 

function float_eval() 
{ 
    local stat=0 
    local result=0.0 
    if [[ $# -gt 0 ]]; then 
     result=$(echo "scale=$float_scale; $*" | bc -q | awk '{printf "%f\n", $0}' 2>/dev/null) 
     stat=$? 
     if [[ $stat -eq 0 && -z "$result" ]]; then stat=1; fi 
    fi 
    echo $result 
    return $stat 
} 
+0

Ist das die Antwort? –

3

Sie einfach alle Ihre Berechnungen und Ausgabe in awk:

float_scale=6 
result=$(awk -v scale=$floatscale 'BEGIN { printf "%.*f\n", scale, 1/2 }') 

Als Alternative, wenn Sie bc zu verwenden, würde es vorziehen, und nicht AWK alleine oder mit 'bc', unterstützt Bash printf Gleitkommazahlen, obwohl der Rest von Bash nicht.

result=$(echo "scale=$float_scale; $*" | bc -q 2>/dev/null) 
result=$(printf '%*.*f' 0 "$float_scale" "$result") 

Die zweite Zeile oben könnte stattdessen sein:

printf -v $result '%*.*f' 0 "$float_scale" "$result" 

, die eine Subshell Art wie sprintf würde und nicht schaffen funktioniert.

2
echo "scale=3;12/7" | bc -q | sed 's/^\\./0./;s/0*$//;s/\\.$//' 
14

In einer Zeile:

printf "%0.6f\n" $(bc -q <<< scale=6\;1/2)