|(パイプ)のあとで値をかえた変数をパイプの外で用いる

|(パイプ)を用いたとき、|のあとの処理は別プロセスで実行されてしまう。そのため、パイプのあととそれ以外では異なる変数となってしまう。以下のようにパイプのあとの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

...)