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 .