ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

bashスクリプトで、ファイルの最後の行が読み込まれない場合の対策

(2020-05-18 初稿 - 2021-05-05 再転記)

はじめに

bashでファイルから一行ずつ読み込んで処理するスクリプトを作っていて、最後の行が読み込まれない現象があった。どうも、読み込むファイルの最後の行に改行がない場合に、読み込まれないようだ。

今まで LinuxRaspberry Pi では、vimばかり使っていたので気が付かなかった(Vimは、最後に改行を付けてくれるらしい。)

Webで検索して、以下のとおり対策があったので、ここに備忘録を残す。

 なお、この記事は以前のGoogle Sitesに掲載していたものの転記である。

 

スクリプト

以下のようなファイル(test.txt)を仮定。

最後の行が改行がなくファイルの終わりになっている点に注意。

【test.txt】

1 abcdef

2 abcdef

3 abcdef

4 abcdef(ファイルの終わり:EOF)

 上記ファイルを、以下のスクリプトで読み込むと4行目が表示されない。^^;

while read line;

do

    echo $line

done < test.txt

 こんなときは、以下のようにすると4行目も読み込まれる。

while read line || [ -n "$line" ];         # 行に何か文字があったら

do

    echo $line

done < test.txt

 おわりに

意外に気が付かずに過ごしてしまいそうなミス。実のところ、筆者もかなり気づくのに時間が掛かった。

今後もミスを犯しやすいところは、備忘録を残すことに。

 

関連ページ