Арифметика с элементами массива в 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