while read的关于读取最后一行的问题

jamex 2012-06-25 07:06:54
以下脚本,

#!/bin/bash
USER="cca"
servers_filename="/eaa/cca/st_scripts/src/servers_cc.txt"
output_file="/eaa/cca/st_scripts/deletelogs/deletelog_cc.log"

date > $output_file

echo "deleting logs for servers in $servers_filename ... "

while read SERVER
do
echo "$SERVER : deleting logs ..."

done < $servers_filename


文件 /eaa/cca/st_scripts/src/servers_cc.txt 内容如下:
server001
server002
server003

(注:server003后面再无任何字符,包括回车)

发现个问题,是关于文本文件servers_cc.txt尾部文件结束符的问题。如果这个文件是Windows的notepad编辑的然后上传到Linux,会比直接在Linux的VI编辑,文件字节数会少1,我估计是文件的尾部的结束符。

问题是:上面的脚本执行起来,会漏读servers_cc.txt的最后一行,如果这个文件是windows下编辑的。
我知道在文本的最后加一个回车能够解决这个问题。


但是,请问,为什么read读不了最后一行? 如何修改脚本来解决这个问题?
...全文
492 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
louyong0571 2012-06-26
  • 打赏
  • 举报
回复
notepad编辑也可以直接转换成unix格式的。
justkk 2012-06-26
  • 打赏
  • 举报
回复
windows使用\r\n作为行结尾,而unix使用\n作为行结尾

使用notepad编辑的文件,如果最后一行没有回车,采用二进制方式上传到unix后,因为最后一行没有\n,会被认为是不完整的文件

循环读到最后一行后,认为达到文件结尾,那个read SERVER会返回假,循环结束。


1、最好使用dos2unix命令转换为unix格式
2、实在不行,只能在while循环之后,再添加一个额外处理
wqkjj 2012-06-26
  • 打赏
  • 举报
回复
同意楼上意见

有些平台上有dtox命令或者dostox命令或者在windows下将dos格式转换成unix格式的软件(比如UltraEdit),利用这些命令可以将windows文本格式转换成unix的文本格式。
qq120848369 2012-06-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
以下脚本,

#!/bin/bash
USER="cca"
servers_filename="/eaa/cca/st_scripts/src/servers_cc.txt"
output_file="/eaa/cca/st_scripts/deletelogs/deletelog_cc.log"

date > $output_file

echo "deleting logs……
[/Quote]

问题一:因为WINDOWS的文本文件使用特殊字节标记文件末尾,所以多1字节。
问题二:还是那个特殊字节的问题,说不上是什么问题,敲个回车把- -。、

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧