【问题标题】:Bash how to store a division to a variableBash如何将除法存储到变量中
【发布时间】:2018-08-23 20:21:18
【问题描述】:

我正在尝试计算以下公式并将值存储到变量中。

伪代码应如下所示:

a=10
b=5
c=$(((($a-$b)/52)) | bc -l)
echo $c

结果为空。我无法弄清楚使用bc 的语法。请帮我用bc代替awk或其他方法。

【问题讨论】:

  • 还指出,如果您需要对浮点等进行繁重的计算bash 可能不是您应该使用的工具! !每次调用bc 时,您都会创建一个子进程(系统调用用户-> 内核模式、fork、exec,...然后内存分配、进程表中的新条目、进程调度程序的更多工作、缓存需要时间未命中并最终未命中页面,动态库可能由bc 加载,...)因此您会损失许多 CPU 周期。如果您为此使用适当的语言,情况就不会如此!

标签: bash floating-point integer division bc


【解决方案1】:

您需要注意两件事。第一个是bc 对表达式使用标准输入,因此您实际上需要通过它管道您的表达式,或者使用<<< 重定向运算符,其中之一:

c=$(echo "($a - $b) / 52" | bc)
c=$(bc <<< "($a - $b) / 52")

&lt;&lt;&lt; 方法特定于 bashksh可能 其他人,但我对它们不是很熟悉)。其他方法可以在大多数 shell 中使用。

其次,在使用大数字时应该小心,因为bc 有将它们分成几行的恼人习惯:

pax$ x=999999999999999999999999999999999999999999999999999999999999999999999

pax$ echo "$x / 7" | bc
14285714285714285714285714285714285714285714285714285714285714285714\
2

为了避免这种情况,你需要改变行长:

pax$ echo "$x / 7" | BC_LINE_LENGTH=0 bc
142857142857142857142857142857142857142857142857142857142857142857142

【讨论】:

    【解决方案2】:

    你可以用这个:

    a=10
    b=5
    c=$(bc -l <<< "($a-$b)/52")
    echo "$c"
    

    .09615384615384615384
    

    或者通过设置3的比例:

    c=$(bc -l <<< "scale=3; ($a-$b)/52")
    echo "$c"
    

    .096
    

    【讨论】:

    • 我选择了 paxdiablo,因为他/她的回答更全面。感谢关注!
    猜你喜欢
    • 2016-07-10
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多