mattintosh note

どこかのエンジニアモドキの備忘録

while read で何故次の行が読めるのか

Qiita に投稿しようと思ったけどなんか毎回同じようなこと書いてても他の人にはまったく関係ないよねってことでブログに。

また新しい疑問が沸いて来た。

while read; do :; done < file で何故次の行が読めるのかわからない。」

だって read < file したって1行目しか読まないじゃん?man bash 読んでも「while read の場合は〜」みたいな解説ないじゃん?

とりあえずやってみた。

$ printf "%d 行目\n" {1..10} > file
$ exec 3<file
$ read -u 3; echo $REPLY
1 行目
$ read -u 3; echo $REPLY
2 行目
$ read -u 3; echo $REPLY
3 行目

できてる。

ということはこういうことか。while が複合コマンドだということを忘れてた。

$ { read; echo $REPLY; read; echo $REPLY; read; echo $REPLY; } < file
1 行目
2 行目
3 行目

2行もできる。

while read odd; read even; [ "$odd$even" ]
do
    printf '\e[41modd : %s\e[m\n' "$odd"
    if [ "$even" ]; then
        printf '\e[42meven: %s\e[m\n' "$even"
    fi
done < file

「50行目まで処理したい」みたいなことをするなら、

for ((i=1;i<=50;i++))
do
     read || break
     echo $REPLY
done < file

でもいいんだな。(それは head でいいんじゃないか?)