2010-06-03 3 views
5

Приветствую!Bash script: укажите формат выходного сигнала bc

Я использую , чтобы сделать некоторые вычисления в моем сценарии. Например:

bc 
scale=6 
1/2 
.500000 

Для дальнейшего использования в моем сценарии мне нужно «0,500000» InstEd из».500000" .

Не могли бы вы помочь мне настроить формат выходного сигнала bc для моего случая?

ответ

3

Быстрого и грязный, так как scale относится только к десятичным цифрам и bc, кажется, не имеет sprintf -like функции:

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

+1 для этого решения: нет необходимости использовать другие инструменты, такие как AWK. –

1

Вы можете поместить использование Ьса в немного лучший контекст? Для чего вы используете результаты bc?

Учитывая следующее в файле под названием some_math.bc

scale=6 
output=1/2 
print output 

в командной строке можно выполнить следующие действия, чтобы добавить ноль:

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

Если я нужен только выходной строки, чтобы иметь ноль для форматирования, я бы использовал awk.

2

Я считаю, что здесь Модифицированная версия функции:

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

Это ответ? –

3

Просто сделать все расчеты и вывод в AWK:

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

В качестве альтернативы, если вы предпочитаете использовать bc и не использовать AWK в одиночку или с «bc», Bash's printf поддерживает числа с плавающей точкой, даже если остальная часть Bash этого не делает.

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

Вторая строка выше, может быть вместо этого:

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

который работает вроде как sprintf бы и не создает подоболочку.

14

В одной строке:

printf "%0.6f\n" $(bc -q <<< scale=6\;1/2) 
Смежные вопросы