while readで最終行が処理されない【シェルスクリプト】

2024-06-13

while readを利用して、catコマンドでファイルを読むこんだ場合に、最終行がある文字が読み込まれない問題

Windowsで生成したファイルをシェルスクリプトでwhile readを利用して、catコマンドでファイルを出力して、内容を読み込み処理をおこなったが、最終行が処理されない状況でした。

$ vim aaa.txt
1 Belgium
2 France
3 Brazil
4 England
5 Uruguay
6 Portugal
7 Croatia
8 Spain
9 Argentina
10 Colombia

$ vim test.sh 
#!/bin/bash
FILENAME=aaa.txt

cat $FILENAME | while read line
do
  echo $line
done

$ sh test.sh
No.1
1 Belgium
2 France
3 Brazil
4 England
5 Uruguay
6 Portugal
7 Croatia
8 Spain
9 Argentina

最終行が処理されなかったファイルを確認するとファイルの最終行に改行文字が含まれていないのが原因のようです。最終行に改行文字がないので処理ができなかったみたいです。

ネットで調べると、下記の様の「 while read LINE || [ -n “${LINE}" ]; 」のような感じで処理すれば表示されるようです

#!/bin/bash
FILENAME=aaa.txt

cat $FILENAME | while read LINE || [ -n "${LINE}" ]; do
  echo "LINE: ${LINE}"
done

$ sh test.sh
1 Belgium
2 France
3 Brazil
4 England
5 Uruguay
6 Portugal
7 Croatia
8 Spain
9 Argentina
10 Colombia

また、いちどvimで開いて保存すれば自動的に最終行には改行文字が含まれるので、あまりWindows側で処理せずLinuxのvimでファイルを生成する方法もあります。

最終行に改行文字が含まないファイルを生成するには、WindowsのAtomの様な高性能なテキストエディタやIDE等のソフトでファイルを保存するとそのようなファイルになることがあります