为什么这个“while”循环不能识别最后一行?

yae*_*ael 6 linux bash rhel shell-script

我们使用以下脚本:

more test.sh
#!/bin/bash

while read -r line
do

echo $line

done < /tmp/file
Run Code Online (Sandbox Code Playgroud)

这是文件:

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
Run Code Online (Sandbox Code Playgroud)

备注 - 在最后一行之后 - 没有空格!

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

./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
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

Kus*_*nda 13

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

while IFS= read -r line || [ -n "$line" ]; do
    printf '%s\n' "$line"
done <file
Run Code Online (Sandbox Code Playgroud)

上面的循环将从调用的文件中读取未修改的行(不去除空格或解释反斜杠控制序列)file并将它们打印到标准输出。

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