Shell脚本 - 处理数组中的浮点数学运算,而不先删除var中的值?

时间:2013-09-20 10:41:31

标签: shell

我正在编写一个小脚本,它将获取我的一个工具的输出,并将读取文件中的值。

我使用数组作为存储,所以一旦数组中包含文件中的值,我就会处理它们,计算各种指标。

现在我意识到做这样的事情是不可能的:

thearray=(1.1 2.2 3.3 4.4 5.5)


tempval=${thearray[0]} + ${thearray[1]}

我想得到数组的第一个元素(位置0)和第二个(位置1)并得到它们的总和,并将结果保存为tempval。 整个数组包含浮点数,所以我假设shell知道数组中的数据类型,并且应该允许我得到总和。

而是输出是字段0的值,“+”和字段1的值

echo $tempval
1.1+2.2

我认为这个问题对于包含数字的变量是通用的,而shell将它们视为字符串,而不是总和来进行连接。

如果我取$ {array [0]} amd $ {the array [1]}的输出,并将它们放在变量中,那么我可以使用$(())语法对它们求和

var1=${the array[0]}
var2=${the array[1]}

tempvar=$((var1+var2))

虽然这似乎适用于整数,而不是浮点数。

有没有办法避免这种情况,直接得到算术和,而不必通过创建变量来存储数组值,然后再进行求和?我需要计算超过14个元素的总和,并且当我计算平均值时,必须创建14个不同的变量来保存值似乎是一个很大的浪费。

我试过这样做

tempval=$((${thearray[0]} + ${thearray[1]}))

但是它返回了一个语法错误:无效的算术运算符。在其他语言中,我会像浮动一样,但在这里我很失落。

任何建议都非常受欢迎。感谢

2 个答案:

答案 0 :(得分:6)

$ thearray=(1.1 2.2 3.3 4.4 5.5)
$ sum=$( IFS="+"; bc <<< "${thearray[*]}" )
$ echo $sum
16.5

表单"${array[*]}"返回一个字符串,每个数组元素由$IFS的第一个字符连接。所以我们将字符串1.1+2.2+3.3+4.4+5.5传递给bc

答案 1 :(得分:5)

  

但是它返回了一个语法错误:无效的算术运算符。

好像你的数组包含浮点数。 bash本身仅支持算术运算,因此您可以使用bc。使用循环求和:

sum=0
for i in "${thearray[@]}"; do
  sum=$(echo $sum + $i | bc -l);
done
echo "Sum = ${sum}"

您可以通过以下方式计算平均值:

average=$(echo $sum / ${#thearray[@]} | bc -l)
echo "Average = ${average}"