Też się kiedyś z tym borykałem i z tego, co pamiętam - NIE DA SIĘ, pętla
while już tak ma.
Nie pamiętam już jak to obszedłem.
====== EDIT =======
Przypomniałem sobie - zrób tak:
#!/bin/sh
#
a=0;
ls /etc/ | ( while read plik;
# ^ NAWIAS !!!
do
echo w petli: $a;
a=55;
done;
#
echo po za petla: $a; )
# ^ NAWIAS !!!
Chodzi o to, że jeżeli robisz potok, to pętla while jest wykonywana w subshellu, czyli w osobnej instancji shella, która kończy swój żywot na słowie kluczowym
done. Czyli zmienna $a poza while;do...done i zmienna $a w obrębie while;do...done to dwie zupełnie różne zmienne ! Dokładając nawiasy "przedłużasz żywot" subshella, na którego kierujesz potok. Oczywiście za nawiasem zmienna $a znowu będzie miała taką wartość, jaką miała przed wywołaniem subshella, czyli 0.