我正在编写一个小脚本,它将获取我的一个工具的输出,并将读取文件中的值。
我使用数组作为存储,所以一旦数组中包含文件中的值,我就会处理它们,计算各种指标。
现在我意识到做这样的事情是不可能的:
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]}))
但是它返回了一个语法错误:无效的算术运算符。在其他语言中,我会像浮动一样,但在这里我很失落。
任何建议都非常受欢迎。感谢
答案 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}"