ハマッた
以下のようなシェルスクリプトを作成したんですよ。
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