コードブロック

for line in `cat list` ;do
    echo $line
done

のようなforループの処理でlistファイルをユニークにして出したいと思ったので、以下のように書いた。

for line in `sort -u list` ;do
    echo $line
done

そこでふと「forで書けるならwhileでも書けるよね。」と思ったが、whileはdoneの後ろがファイル名からリダイレクトするので、

while read line ;do
    echo $line
done < `sort -u list`

とは書けない。で、ちょっと考えると、これはtrコマンドが

tr -d '文字' input_file

ではなく、

tr -d '文字' < input_file

cat input_file | tr -d '文字'

と書かねばならないのと似ているなと思って、コードブロックならwhileで書けることに気づいた。

sort -u list | { while read line ;do
    echo $line
done }

書いてみたところで、「{}はいらないのでは?」と思ったら案の定、動いた。

sort -u list | while read line ;do
    echo $line
done

なんというか、自分の知識の浅さを知った次第。