bashのIFSに改行のみを設定するには

bashのIFSに改行のみを設定するのにはまった。

シェルスクリプト中でコードとして定義

IFS='
'

もちろんコマンドライン中ではあり得ない表記だ。

¥’¥n’

これに気がつくまで時間がかかった

$'string' の形式を持つ単語は特殊な扱いを受けます。 この単語は string に展開され、 それから ANSI C 標準で仕様が決められている、 バックスラッシュでエスケープされている文字に置き換えられます。 バックスラッシュエスケープシーケンスは、 (もし存在すれば) 以下のようにデコードされます:

\n
改行文字

$ echo "foo bar buzz" >> a
$ echo "foo bar buzz" >> a
$ echo "foo bar buzz" >> a
$ cat a
foo bar buzz
foo bar buzz
foo bar buzz
$ (IFS=$'\n';for i in `cat a`;do echo ${i}bbb; done)
foo bar buzzbbb
foo bar buzzbbb
foo bar buzzbbb
$ for i in `cat a`;do echo ${i}bbb; done
foobbb
barbbb
buzzbbb
foobbb
barbbb
buzzbbb
foobbb
barbbb
buzzbbb

ちなみにデフォルトである 改行タブ空白を設定するときには

IFS="$'\n'$'\t' "