ハマッた

以下のようなシェルスクリプトを作成したんですよ。

HOGE=""
for fuga in `cat data.txt`
	HOGE="${HOGE}'${fuga}',"
done

data.txtの中身がこう

aaa
bbb
ccc

で、期待する出力が

'aaa'
'aaa','bbb',
'aaa','bbb','ccc',

だったんです。


ところが、いざ実行してみたらこんな結果になる。

'aaa
','bbb
','ccc

なんだこれ?
どうすればこんな結果になるんだ?


実はこのスクリプト、先週はちゃんと動いていた。
今日、最終テストをするためにローカルからサーバへ一式アップロードし直しただけでソースは全然変えていないのだが。


さらによく分からないのが、ローカルのCygwin上で実行すると期待通りの動作をする。


とまあ、こんな感じで2時間ほどハマってました。
ベテランな方とか勘のよい人なら、もう原因はお分かりですね。


結局、原因は改行コード。
先週テストした時は data.txt をサーバで作成していたので問題無かったのだが、今日は Windows 上で作ったファイルを ftp で転送、しかもバイナリモードで転送されていたために改行コードが CRLF になっていた、と。
つまり、実行結果の一行目
'aaa
は後ろのシングルクオートが消えたのではなく、実際のデータは
'aaa\r'
と aaa の後ろにキャリッジリターン(\r)が入っているために、 aaa を表示した後にカーソルが行頭に復帰し、最後のシングルクオートは行の先頭のシングルクオートを上書きして表示されているのである。
別々の記号で挟んでればもっと早く気付いたんだろうな……orz