为了账号安全,请及时绑定邮箱和手机立即绑定

Shell脚本读取最后一行丢失

Shell脚本读取最后一行丢失

慕尼黑8549860 2019-11-25 20:16:13
Shell脚本读取最后一行丢失我有一个... bash shell脚本的奇怪问题,我希望得到一些见解。我的团队正在编写一个脚本,该脚本遍历文件中的行并检查每个行中的内容。我们有一个错误,当通过将不同脚本排序在一起的自动化过程运行时,最后一行没有被看到。使用的代码遍历文件中的行(名称存储在DATAFILE被cat "$DATAFILE" | while read line我们可以从命令行运行脚本,它会看到文件中的每一行,包括最后一行,就好了。但是,当由自动化进程(运行在相关脚本之前生成DATAFILE的脚本)运行时,永远不会看到最后一行。我们更新了代码以使用以下代码迭代这些行,并清除了问题:for line in `cat "$DATAFILE"`注意:DATAFILE没有在文件末尾写入换行符。我的问题是两部分......为什么最后一行不会被原始代码看到,为什么这会改变有所作为呢?我只想到我能想出为什么最后一行不会被看到:前一个写入文件的进程依赖于进程结束以关闭文件描述符。问题脚本正在启动并以足够快的速度打开文件,而前一个进程已“结束”,它没有“关闭/清理”足以让系统自动关闭文件描述符。话虽这么说,似乎,如果你在shell脚本中有2个命令,那么第一个应该在脚本运行第二个时完全关闭。对问题的任何见解,尤其是第一个,都将非常感激。
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

根据read命令POSIX规范,如果“检测到文件结尾或发生错误”,它应返回非零状态。由于在读取最后一行“EOF”时检测到EOF,因此它会设置$line然后返回错误状态,并且错误状态会阻止循环在最后一行“行”上执行。解决方案很简单:如果读取命令成功或者读入任何内容,则执行循环$line

while read line || [ -n "$line" ]; do


查看完整回答
反对 回复 2019-11-26
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

添加一些额外信息:

  1. 没有必要使用catwhile循环。while ...;do something;done<file足够。

  2. 不要读行for

使用while循环读取行时:

  1. 设置IFS正确(否则可能会丢失缩进)。

  2. 您应该几乎总是将-r选项与read一起使用。

满足上述要求时,正确的while循环将如下所示:

while IFS= read -r line; do
  ...done <file

并使其在没有换行符的情况下使用文件(从此处重新发布我的解决方案):

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

或者使用grepwhile循环:

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



查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 773 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信