Арифметика с элементами массива в bash

Я использую 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

редактировать: я должен был быть более понятным, почему я хочу использовать расщепление массива для цикла

Ввод может быть ------> Дэвид 34 28 9 12

И я хочу напечатать ---> Дэвид 83

Так что я хотел бы пройтись по всем элементам принять первый. так что я бы использовал:

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

из-за этого я не могу использовать:

for i in "${array[@]}"

2 ответа

Решение

Попробуйте использовать 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

После редактирования ОП:

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

Если вы хотите суммировать числа в каждой строке файла, используя цикл в 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
Другие вопросы по тегам