Если вы просто хотите избежать создания временных файлов (или сохранения вывода grep в переменной), вы можете передать его в цикл for следующим образом:
#!/bin/bash IFS=$'\n' yay=0 nay=0 for line in `avro-read /log/huge_data | grep $param1 | grep $param3`; do [[ $line =~ $param2- ]] && yay=$(($yay + 1)) || nay=$(($nay + 1)) done echo $yay / $nay \* 100 | bc -l unset IFS
Я создал модифицированную версию подхода в вашем ответе, который не требует временных файлов:
#!/bin/bash (avro-read /log/huge_data | grep $param1 | grep $param3 | tee \ >(echo yay=`grep -c "$param2-"`) \ >(echo nay=`grep -vc "$param2-"`) \ >/dev/null | cat ; echo 'echo $yay / $nay \* 100 | bc -l') | sh
Вывод отдельных grep -c
команд и echo
команды печатается как
yay=123 nay=456 echo $yay / $nay \* 100 | bc -l
чтобы избежать условий гонки 1 . Трубопровод sh
выполняет исполняемые команды.
1 Какая бы grep -c
команда не заканчивалась первой, будет напечатана первая строка вывода.