我是bash的新手,我想知道为什么我的脚本不能按照我希望的方式工作。
我有这个bash脚本:
#!/bin/bash
read n
var=($(cat))
bim=${var[*]}
toto=$(echo $bim | sed 's/ /+/g' | bc)
echo $toto
bobo=$(($toto/$n | bc -l))
echo $bobo | awk '{printf "%.3f\n", $1}'这应该是将"cat“存储在数组中的所有值相加,并将总数除以"read”读取的第一个值。并且结果应该返回三位小数的小数值。但是,当我使用bc -l时,它只向我返回一个舍入数字!当我使用awk '{printf% .3f ", $ 1}'时,它会打印.000!
你知道为什么吗?谢谢
发布于 2021-03-24 06:59:10
bash只做整数运算和算术扩展
bobo=$(($toto/$n | bc -l))不会像你想的那样做。| bc -l中的管道标志不是管道标志。这是一个按位的OR。细分:
$toto被解释为变量(就像toto)$n被解释为变量一样(正如n)|是按位的一样) ORbc被解释为变量(其值0)-被解释为减号(在算术中,expression)l被解释为变量(其值为0)因此,它变成了与整数除法toto/n相同的$toto/$n | 0 -0 (在算术展开中,变量不需要$)。
您也可以使用bc来划分,但您需要在bc中设置scale。下面是一个在执行除法之前将其设置为3的示例:
bobo=$(echo "scale=3;$toto/$n" | bc)请注意,您不需要通过awk对此进行echo。只要使用echo $bobo,你就会得到你想要的结果。
示例输入:
3
11.3
9
8应用建议的更改后的输出:
28.3
9.433https://stackoverflow.com/questions/66772192
复制相似问题