微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 为什么这个’while’循环不能识别最后一行?

我们使用以下脚本:

more test.sh
#!/bin/bash

while read -r line
do

echo $line

done < /tmp/file

这是文件

kafka-broker,log.retention.hours,12
kafka-broker,default.replication.factor,2
fefolp-defaults,fefolp.history.fs.cleaner.interval,1d
fefolp-defaults,fefolp.history.fs.cleaner.maxAge,2d
fefolp-env,fefolp_daemon_memory,10000
blo-site,blo.nodemanager.localizer.cache.target-size-mb,10240
blo-site,blo.nodemanager.localizer.cache.cleanup.interval-ms,300000
ams-env,metrics_collector_heapsize,512
fefolp,hbase_master_heapsize,1408
fefolp,hbase_regionserver_heapsize,512
fefolp,hbase_master_xmn_size,192
core-site,blolp.proxyuser.ambari.hosts,*
core-site,Hadoop.proxyuser.root.groups,*
core-site,Hadoop.proxyuser.root.hosts,*
blo-site,blo.scheduler.minimum-allocation-mb,1024
blolp-env,fefolp_heapsize,4096

备注 – 在最后一行之后 – 没有空间!

但脚本只打印这些行(最后一行除外):

./test.sh
kafka-broker,log.retention.hours,12
kafka-broker,default.replication.factor,2
fefolp-defaults,fefolp.history.fs.cleaner.interval,1d
fefolp-defaults,fefolp.history.fs.cleaner.maxAge,2d
fefolp-env,fefolp_daemon_memory,10000
blo-site,blo.nodemanager.localizer.cache.target-size-mb,140
blo-site,blo.nodemanager.localizer.cache.cleanup.interval-ms,300
ams-env,metrics_collector_heapsize,51
fefolp,hbase_master_heapsize,1408
fefolp,hbase_regionserver_heapsize,542
fefolp,hbase_master_xmn_size,19
core-site,blolp.proxyuser.ambari.hosts,*
core-site,Hadoop.proxyuser.root.groups,*
core-site,Hadoop.proxyuser.root.hosts,*
blo-site,blo.scheduler.minimum-allocation-mb,1024

为什么会这样?

解决方法:

您的输入文本包含一个不完整的行作为其最后一行.最后一行不是由换行符终止的.

while IFS= read -r line || [ -n "$line" ]; do
    printf '%s\n' "$line"
done <file

上面的循环将从名为file的文件中读取未修改的行(不剥离空格或解释反向控制序列)并将它们打印到标准输出.

读取不完整的行时,读取将失败,但$line仍将包含数据.额外的-n测试将检测到这一点,以便允许循环体输出不完整的行.在此之后的迭代中,read将再次失败并且$line将是一个空字符串,从而终止循环.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐