2014-12-24 3 views
0

Я пишу скрипт в Bash, и у меня есть проблема с суммами элементов массива. Я добавляю к результатам массива df для двух путей. В результате я хочу получить элементы суммы массива.Баш-сумма массива

use=() 
i=0 
for d in '$PATH1' '$PATH2' 
do 
    usagebck=$(du $d | awk '{print awk $1}') 
    use[i]=$usagebck 
    sum=0 
    for j in $use 
    do 
      sum=$($sum + ${use[$i]}) 

    done 

    i=$((i+1)) 

done 
echo ${use[*]} 
+0

Что вы хотите сказать? –

+0

Переменные не расширяются в одинарных кавычках. Таким образом '' $ PATH'' является буквальной строкой '$ PATH'. –

+0

Также нет причин иметь переменную 'usebck' в этом скрипте как написанную. И '$ use' даст вам первое значение в массиве. –

ответ

3

Если du имеет опцию -s:

use=() 
sum=0 
for d in "$PATH1" "$PATH2" 
do 
    usagebck="$(du -s "$d" | awk 'END{print $1}')" 
    use+=($usagebck) 
    ((sum+=$usagebck)) 
done 
echo ${use[*]} 
echo $sum 
+0

Нет причин предпочитать' $ {use [*]} 'over' "$ {use [@]}" здесь. – chepner

1

Первое, обратите внимание на параметры в du. В системах на базе BSD есть -c, что даст вам общее. В GNU и BSD есть параметр -a, который будет сообщать обо всех файлах для каталога.

Поскольку вы уже используете awk, почему бы не сделать все в awk?

$ du -ms $PATH1 $PATH2 | 
    awk 'BEGIN {sum = 0} 
     END {print "Total: " sum } 
     { 
      sum+=$1 
      print $0 
     }' 
  • du -ms указывает, что я хочу, общие суммы каждого файла указано
  • BEGIN выполняется перед основной awk программы. Здесь я инициализирую sum. Это не обязательно, потому что при создании предполагается, что переменные считаются равными нулю.
  • END выполнен после основной программы awk. Здесь я указываю, что хочу напечатать sum.
  • Между { ... } является основной программой Awk. Две линии. Первая строка добавляет столбец 1 (размер файла) в sum. Вторая строка выводит всю строку.
Смежные вопросы