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 でいいんじゃないか?)