Bash: увеличивать переменную в цикле while?

Bash новичок здесь!

У меня есть сценарий bash, который для каждого файла в наборе связывает каждую строку в файле для строки. Затем он разбивает строку на запятую, преобразует 7-й элемент в float и увеличивает текущее значение на это значение.

Это выглядит так:

for filename in data*.CSV; do echo $filename ACTUAL_COST=0 grep '040302010' $filename | while read -r line ; do IFS=',' read -a array <<< "$line" ACTUAL_COST=$(echo "$ACTUAL_COST + ${array[7]}" | bc) echo $ACTUAL_COST done echo $ACTUAL_COST done 

Но проблема, с которой я сталкиваюсь, заключается в том, что это производит вывод следующим образом:

 53.4 72.2 109.1 0 

Последнее значение всегда равно 0. После Googling немного, я думаю, это потому, что цикл while выполняется в подоболочке, и поэтому внешняя переменная не изменяется.

Я понимаю, что мне, вероятно, нужно выполнить внутренний цикл в функции, но я изо всех сил пытаюсь понять, как это сделать. Может ли кто-нибудь помочь?

3 Solutions collect form web for “Bash: увеличивать переменную в цикле while?”

Возможно, было бы удобно ввести другую подстановку команд с логикой цикла ядра, определенной в функции:

 sum_cost() { sum=0 while read -r line ; do IFS=',' read -a array <<< "$line" sum=$(echo "$sum + ${array[7]}" | bc) done echo $sum } for filename in data*.CSV; do echo $filename ACTUAL_COST=$(grep '040302010' $filename | sum_cost) echo $ACTUAL_COST done 

Это не то, как вы делаете shell-скрипты . Вы выполняете несколько команд последовательно для каждой строки файлов!

Здесь вам нужно что-то вроде:

 awk -F, '/040302010/ {actual_cost += $7} ENDFILE {print FILENAME ":", +actual_cost; actual_cost=0} ' data*.CSV 

(предполагая GNU awk).

Это одна команда для всех ваших файлов.

Чтобы избежать подоболочки, вы можете использовать следующее:

 while read -r line do your_stuff done < <(grep '040302010' $filename') 

Таким образом, вы можете заполнить результат (ы) в переменной.

  • Наследовать перенаправления IO из сценария в другой
  • Условное выполнение - запуск постоянных подпроцессов и коротинов
  • Использование MPI с .sh скриптом?
  • Помогите разобрать эту команду `find`
  • Есть ли способ увидеть, какой процесс вызвал сценарий оболочки?
  • Как обрабатывать цикл while-do и сортировать результат с итерацией
  • Ошибка при замене части команды curl переменной
  • Интеграция основного ключа Pass / Firefox?
  • BASH - Ассоциативный массив - получение значения ключа в конечном элементе
  • Как заставить sed выполнять действия только в первом матче?
  • Как создать новые процессы для новых экземпляров одного и того же сценария оболочки?
  • Linux и Unix - лучшая ОС в мире.