while readで最終行が処理されない【シェルスクリプト】
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等のソフトでファイルを保存するとそのようなファイルになることがあります
ディスカッション
コメント一覧
まだ、コメントがありません