Bash脚本:指定bc输出数字格式

问题描述 投票:0回答:6

我使用

在我的脚本中进行一些计算。例如:

bc
scale=6
1/2
.500000

为了在我的脚本中进一步使用,我需要“

0.500000
”而不是“
.500000
”。

您能帮我为我的案例配置

bc
输出数字格式吗?

bash format
6个回答
20
投票

一行:

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

5
投票

只需在 awk 中完成所有计算和输出:

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

作为替代方案,如果您更喜欢使用

bc
而不是单独使用 AWK 或与 'bc' 一起使用,Bash 的
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
会但不会创建子 shell。


4
投票

快速而肮脏,因为

scale
仅适用于十进制数字,而
bc
似乎没有类似
sprintf
的功能:

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

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

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
}

1
投票

你能把 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。

© www.soinside.com 2019 - 2024. All rights reserved.