在Bash中对数组元素进行算术运算

5

我正在使用Bash,尝试添加从文件创建的数组中的所有元素。

while read line; do
    array=($line);
    sum=0
    length=${#array[@]}
    for i in ${array[@]:0:$length}; do
       sum=$[$sum+${array[i]}]   #<--- this doesn't work?
    done
    echo $sum
done < $1

编辑:

我应该更清楚地解释为什么我想在for循环中使用数组拆分。

输入可能是 ------> david 34 28 9 12

我想打印 ---> david 83

所以我想循环遍历除第一个元素外的所有元素。因此,我会使用:

length=$[${#array[@]} - 1]
for i in${array[@]:1:$length}

由于这个原因,我无法使用:
for i in "${array[@]}"
2个回答

6
尝试使用expr来添加两个表达式,例如:
sum=$(expr "$sum" + "${arr[i]}")

或者

sum=$((sum + arr[i]))


echo "11 13" >test.txt 
echo "12" >>test.txt

while read -a line; do ##read it as array
    sum=0
    for ((i=1; i < ${#line}; i++)); do ##for every number in line
       sum=$(expr "$sum" + "${line[i]}") ## add it to sum
    done
    echo $line[0] $sum ##print sum
done < test.txt
Output
36

在 OP 进行编辑后:
echo "ABC 11 13" > test.txt echo "DEF 12" >> test.txt
while read -a line; do ##read it as array
sum=0
for ((i=1; i < $((${#line[@]})); i++)); do ##for every number in line
   sum=$(expr "$sum" + "${line[i]}") ## add it to sum
   if [[ $i -eq $((${#line[@]}-1)) ]]
   then
       echo "${line[0]} $sum" ##print sum
       sum=0
   fi
done
done < test.txt
Output:
ABC 24
DEF 12

sum=$(expr "$sum" + "${arr[i]}"):这个会报错。sum=$((sum + arr[i])):不起作用 :/,也没有报错。 - Vaderico
我已经修改了你的脚本。 - SMA
我不能使用那个for循环,我在编辑后的问题中解释了原因。 - Vaderico
如何看待 for i in "${!line[@]}"; do 或者 for ((i=0; i < ${#line}; i++)) 或者 for ((i=0; i < ${length}; i++))?同时请勿在问题中不断添加额外的要求。 - SMA
问题不在于循环,我已经成功地从索引1迭代到数组长度。问题在于算术运算。它无法接受整数和数组字符串数字的相加。 - Vaderico
好的,那也可以,谢谢你的帮助!非常感谢。 - Vaderico

2

如果您想使用bash中的循环来对文件中每行的数字进行求和,可以这样做:

#!/bin/bash
while read line; do
    array=($line);
    sum=0
    length=${#array[@]}
    for i in ${array[@]:0:$length}; do
       sum=$[$sum+$i]
    done
    echo $sum
done < "$1"

你的代码与这段代码的不同之处在于,i是数组中的元素而不是索引。

然而,在Bash中占有文件相当慢。你最好使用awk来完成任务,例如:

awk '{s=0;for(i=1;i<=NF;i++) s+=$i;print s}' file

我不能使用那个for循环,我在编辑后的问题中解释了原因。 - Vaderico
@Vaderico,仍然是值而不是索引。请参见编辑。此外,您在问题中有一个拼写错误。应该是length=${#array[@]}而不是length=${#arr[@]} - user000001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接