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') 

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

  • Проверьте, установлены ли несколько переменных
  • Получение полной командной строки, вызвавшей ERR, в то время как ловушка
  • Печать цветного текста с использованием скрипта
  • Использование файла ASCII в mailx
  • Могу ли я проверить, работает ли create_ap?
  • Как удалить папки, созданные с именами дат 2016-04-03 до 2016-10-4
  • Вычитание времени Bash
  • встроенные условия для назначения
  • Добавить определенные слова в файл
  • Как проверить первый элемент в массиве
  • Что означает различие с фигурными фигурными скобками?
  • Interesting Posts

    Настройка dnsmasq в Mint / Ubuntu / Debian

    Не работает привязка к интерфейсу VPN

    Надежное определение свободной памяти

    Самая высокая версия glibc, работающая с фактическим оборудованием 386

    воспроизводить mp3-файл сразу после его загрузки

    ошибка в редактировании vim, вызванная вкладкой или диакритикой?

    Найдите, какие файлы не дублируются во втором месте, независимо от различий в структуре каталогов?

    синхронизация локальной электронной почты с imap-mutt-friendly

    Почему терминалы отображаются в блоках фиксированной ширины

    Bash: переписывание файла, который читается в одной строке

    Как добиться двунаправленной синхронизации пользовательских файлов пользователем1 при сохранении mtimes?

    Barebone Linux Bluetooth-соединение

    Что делает опцион конфигурации «virtual_private» Openswan под капотом?

    Не удалось перенаправить вывод ввода-вывода в FreeBsd

    название динамического окна из ввода команды (TCSH)

    Linux и Unix - лучшая ОС в мире.