|(パイプ)を用いたとき、|のあとの処理は別プロセスで実行されてしまう。そのため、パイプのあととそれ以外では異なる変数となってしまう。以下のようにパイプのあとのwhileからuserを用いるところまで()でくくればパイプのあとでもuserの値は保持される。くくらなかった場合はdoneのあと、userの値は空になってしまう。
ls -1 /var/spool/usernames | (while read line do cnt=`expr $cnt + 1` if [ $cnt = $num ]; then user=$line break fi done ...)