2

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

我使用数组作为存储,因此一旦数组具有文件中的值,我就会处理它们,计算各种指标。

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

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 将它们视为字符串,进行连接而不是求和。

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

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

tempvar=$((var1+var2))

尽管如此,这似乎适用于整数,而不是浮点数。

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

我试过这样做

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

但它返回给我一个语法错误:无效的算术运算符。在其他语言中,我会转换为浮点数,但在这里我很迷茫。

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

4

2 回答 2

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.5bc

于 2013-09-20T15:51:38.913 回答
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}"
于 2013-09-20T12:06:06.333 回答