bash while loop drops last line of text file [duplicate]

二次信任 提交于 2019-12-12 07:23:03

问题


when i cat this file I get 6 lines (it is a diff file)

bash-3.00$ cat /tmp/voo
18633a18634
> sashabSTP
18634a18636
> sashatSTP
21545a21548
> yheebash-3.00$

however when i read it line by line i only get 5 lines.

bash-3.00$ while read line ; do echo $line ; done < /tmp/voo
18633a18634
> sashaSTP
18634a18636  
> sashatSTP
21545a21548

or this

bash-3.00$ cat /tmp/voo | while read line ; do  echo $line ; done
18633a18634
> sashabSTP
18634a18636
> sashatSTP
21545a21548
bash-3.00$

i am missing the last line 'yhee' from the while loops.


回答1:


Note:

21545a21548
> yheebash-3.00$
      ^---- no line break

Your file doesn't terminate with a line break.




回答2:


If you are wondering why?, this might satisfy your curiosity.

If you work with files which may or may not end up with a new line at end, you can do this:

while IFS= read -r line || [ -n "$line" ]; do
  echo "$line"
done <file

Or this:

while IFS= read -r line; do
  echo "$line"
done < <(grep "" file)

Read more:

  1. https://stackoverflow.com/a/31397497/3744681
  2. https://stackoverflow.com/a/31398490/3744681


来源:https://stackoverflow.com/questions/20359553/bash-while-loop-drops-last-line-of-text-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!