while read

UNIX OSを使っていると、ときどき

$ cat > test1.txt
AAAAAA
BB
CCC
D

ファイルの中身を1行ずつ何かのコマンドに渡したくて、

$ for i in `cat test1.txt` ; do (echo "==$i") ; done
==AAAAAA
==BB
==CCC
==D

catの出力によるforループを書いたりすることが、ありますよね?
しかしながら、

$ cat test.txt
-e A HOGE
-e B
-g XX 1 2 3 4
-g YYY
-e C

スペース区切りレイアウトのファイルに対して、同じように、catを使っちゃうと、

$ for i in `cat test.txt` ; do (echo "==$i") ; done
==-e
==A
==HOGE
==-e
==B
==-g
==XX
==1
==2
==3
==4
==-g
==YYY
==-e
==C

スペースごとにバラされて、1個ずつコマンドに渡ってしまいます。
こういうときは、while readを使います。

$ while read i; do (echo "==$i") ; done < test.txt
==-e A HOGE
==-e B
==-g XX 1 2 3 4
==-g YYY
==-e C

めでたしめでたし。