Поздравления!
Я использую bс для создания некоторых вычислений в моем сценарии. Например:
bc
scale=6
1/2
.500000
Для дальнейшего использования в моем сценарии мне нужно "0.500000" insted ".500000".
Вы могли помочь мне по возможности настроить до н.э выходной числовой формат для своего случая?
Я считаю, что это модифицированная версия функции:
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
}
Можете ли вы объяснить использование bc в более понятном контексте? Для чего вы используете результаты bc?
Учитывая следующее в файле под названием some_math.bc
scale=6
output=1/2
print output
в командной строке я могу сделать следующее, чтобы добавить ноль:
$ bc -q some_math.bc | awk '{printf "%08f\n", $0}'
0.500000
Если бы мне нужно было, чтобы в выходной строке был ноль только для форматирования, я бы использовал awk.
Быстро и грязно, поскольку scale
применяется только к десятичным цифрам, а bc
, похоже, не имеет sprintf
-подобной функции:
$ bc
scale = 6
result = 1 / 2
if (0 <= result && result < 1) {
print "0"
}
print result;
Просто выполняйте все свои вычисления и выводите их в awk:
float_scale=6
result=$(awk -v scale=$floatscale 'BEGIN { printf "%.*f\n", scale, 1/2 }')
В качестве альтернативы , если вы предпочитаете использовать bc
и не использовать AWK отдельно или с 'bc', printf
Bash поддерживает числа с плавающей запятой, хотя остальная часть 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
, но не создает подоболочку.