« というわけでPHPの標準入力 | トップページ | PostgreSQL:work memoryの動的設定 »

2014.05.09

ヒアドキュメントとunexpected end of file

bashでツールを作ってもらってた後輩から
「かっしいさん、謎のエラーが出ます(^^;」
という相談があったので内容確認。

エラーの内容は

line 57: syntax error: unexpected end of file
となっており、素直に読むとEOFが検出できなかった、というように見える。
ファイルを見ると最終行にLFがなく、EOFで終わってた。
むかーしWindowsのHostsの記述で最終行をCR+LFなしにEOFとすると、その最終行の内容を認識しない、という経験があったのでやってみた。

ダメ。コレジャナイ。

そこでソースを追っかけることにする。スクリプトの随所にechoを入れてもそいつらは引っかからず、とにかく終端エラーとなる。うーーん。

悩むこと数分。特徴的なのはヒアドキュメントを使っている部分があるということに気づいた。

while read LINE
do
  process << EOF
  EOF
done
exit(0)

コレだ!

whileループ内をきれいにするためのインデント処理が徒になっていた。
EOFの前のスペースを除去するとエラーは回避された。

while read LINE
do
  process << EOF
EOF
done
exit(0)
ちょっとインデントがそろわず見づらいところはあるけども、こうでないとヒアドキュメントが正常に動作しないのであった。
一見するときれいなソースに見えたので、発見が遅れてしまったよ(^^;

なお、どうしてもインデントしたいのであればタブインデントにすれば

while read LINE
do
  process <<-EOF
  EOF(スペースではなくタブ)
done
exit(0)
のように<<-で指定してあげればタブは無視してくれる。

ただ弊社はインデント規約はスペース4字なので、タブインデントにはなってないので、基本は禁じ手である(^^;

|

« というわけでPHPの標準入力 | トップページ | PostgreSQL:work memoryの動的設定 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59606725

この記事へのトラックバック一覧です: ヒアドキュメントとunexpected end of file:

« というわけでPHPの標準入力 | トップページ | PostgreSQL:work memoryの動的設定 »