O problema que você está vendo é o "pipe cria subshell" padrão com bash
.
por exemplo, se você fizer
a=10
echo 100 | read a
echo $a
então a
ainda será definido como 10
com bash.
No seu caso você tem
igreppy | while read ...
do
....
done
e todas as coisas dentro desse while
do loop estarão em uma subcamada.
Em vez disso, ele pode ser reescrito usando a substituição do processo
while read ...
do
....
done < <(igreppy ...)
Agora nenhum subshell é criado para o loop while
.