Why does this 'while' loop not recognize the last line?











up vote
2
down vote

favorite
1












We use the following script:



more test.sh
#!/bin/bash

while read -r line
do

echo $line

done < /tmp/file


This is the 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


Remark - after the last line - there are no space!



But the script prints only these lines (except the last line):



./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


Why does this happen?










share|improve this question
























  • because the last text line is not complete. you need a n there.
    – Rui F Ribeiro
    2 days ago












  • do you have suggestion how to add n on the last line in the file , so I will put thus in the scritp
    – yael
    2 days ago










  • echo >> file as a poor mans solution.
    – Rui F Ribeiro
    2 days ago










  • Note POSIX defines "line" as a sequence of zero or more non- <newline> characters plus a terminating <newline> character. Your last line isn't even a line in this context.
    – Kamil Maciorowski
    2 days ago















up vote
2
down vote

favorite
1












We use the following script:



more test.sh
#!/bin/bash

while read -r line
do

echo $line

done < /tmp/file


This is the 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


Remark - after the last line - there are no space!



But the script prints only these lines (except the last line):



./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


Why does this happen?










share|improve this question
























  • because the last text line is not complete. you need a n there.
    – Rui F Ribeiro
    2 days ago












  • do you have suggestion how to add n on the last line in the file , so I will put thus in the scritp
    – yael
    2 days ago










  • echo >> file as a poor mans solution.
    – Rui F Ribeiro
    2 days ago










  • Note POSIX defines "line" as a sequence of zero or more non- <newline> characters plus a terminating <newline> character. Your last line isn't even a line in this context.
    – Kamil Maciorowski
    2 days ago













up vote
2
down vote

favorite
1









up vote
2
down vote

favorite
1






1





We use the following script:



more test.sh
#!/bin/bash

while read -r line
do

echo $line

done < /tmp/file


This is the 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


Remark - after the last line - there are no space!



But the script prints only these lines (except the last line):



./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


Why does this happen?










share|improve this question















We use the following script:



more test.sh
#!/bin/bash

while read -r line
do

echo $line

done < /tmp/file


This is the 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


Remark - after the last line - there are no space!



But the script prints only these lines (except the last line):



./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


Why does this happen?







linux bash shell-script rhel






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago









Peter Mortensen

85358




85358










asked 2 days ago









yael

2,3091754




2,3091754












  • because the last text line is not complete. you need a n there.
    – Rui F Ribeiro
    2 days ago












  • do you have suggestion how to add n on the last line in the file , so I will put thus in the scritp
    – yael
    2 days ago










  • echo >> file as a poor mans solution.
    – Rui F Ribeiro
    2 days ago










  • Note POSIX defines "line" as a sequence of zero or more non- <newline> characters plus a terminating <newline> character. Your last line isn't even a line in this context.
    – Kamil Maciorowski
    2 days ago


















  • because the last text line is not complete. you need a n there.
    – Rui F Ribeiro
    2 days ago












  • do you have suggestion how to add n on the last line in the file , so I will put thus in the scritp
    – yael
    2 days ago










  • echo >> file as a poor mans solution.
    – Rui F Ribeiro
    2 days ago










  • Note POSIX defines "line" as a sequence of zero or more non- <newline> characters plus a terminating <newline> character. Your last line isn't even a line in this context.
    – Kamil Maciorowski
    2 days ago
















because the last text line is not complete. you need a n there.
– Rui F Ribeiro
2 days ago






because the last text line is not complete. you need a n there.
– Rui F Ribeiro
2 days ago














do you have suggestion how to add n on the last line in the file , so I will put thus in the scritp
– yael
2 days ago




do you have suggestion how to add n on the last line in the file , so I will put thus in the scritp
– yael
2 days ago












echo >> file as a poor mans solution.
– Rui F Ribeiro
2 days ago




echo >> file as a poor mans solution.
– Rui F Ribeiro
2 days ago












Note POSIX defines "line" as a sequence of zero or more non- <newline> characters plus a terminating <newline> character. Your last line isn't even a line in this context.
– Kamil Maciorowski
2 days ago




Note POSIX defines "line" as a sequence of zero or more non- <newline> characters plus a terminating <newline> character. Your last line isn't even a line in this context.
– Kamil Maciorowski
2 days ago










1 Answer
1






active

oldest

votes

















up vote
6
down vote



accepted










Your input text contains an incomplete line as its last line. The last line is not terminated by a newline.



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


The above loop will read unmodified lines (without stripping whitespaces or interpreting backslashed control sequences) from the file called file and print them to standard output.



When an incomplete line is read, read will fail, but $line will still contain data. The extra -n test will detect this so that the loop body is allowed to output the incomplete line. In the iteration after that, read will fail again and $line will be an empty string, thus terminating the loop.






share|improve this answer





















  • the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
    – yael
    2 days ago










  • so if need to add "n on the last line , then need sed/perl to add the "" for this solution
    – yael
    2 days ago












  • @yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
    – Kusalananda
    2 days ago










  • ok , so maybe I will post another question for how to add "n" on the last line
    – yael
    2 days ago






  • 1




    @yael How to add a newline to the end of a file?
    – Kusalananda
    2 days ago











Your Answer








StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f482517%2fwhy-does-this-while-loop-not-recognize-the-last-line%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
6
down vote



accepted










Your input text contains an incomplete line as its last line. The last line is not terminated by a newline.



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


The above loop will read unmodified lines (without stripping whitespaces or interpreting backslashed control sequences) from the file called file and print them to standard output.



When an incomplete line is read, read will fail, but $line will still contain data. The extra -n test will detect this so that the loop body is allowed to output the incomplete line. In the iteration after that, read will fail again and $line will be an empty string, thus terminating the loop.






share|improve this answer





















  • the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
    – yael
    2 days ago










  • so if need to add "n on the last line , then need sed/perl to add the "" for this solution
    – yael
    2 days ago












  • @yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
    – Kusalananda
    2 days ago










  • ok , so maybe I will post another question for how to add "n" on the last line
    – yael
    2 days ago






  • 1




    @yael How to add a newline to the end of a file?
    – Kusalananda
    2 days ago















up vote
6
down vote



accepted










Your input text contains an incomplete line as its last line. The last line is not terminated by a newline.



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


The above loop will read unmodified lines (without stripping whitespaces or interpreting backslashed control sequences) from the file called file and print them to standard output.



When an incomplete line is read, read will fail, but $line will still contain data. The extra -n test will detect this so that the loop body is allowed to output the incomplete line. In the iteration after that, read will fail again and $line will be an empty string, thus terminating the loop.






share|improve this answer





















  • the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
    – yael
    2 days ago










  • so if need to add "n on the last line , then need sed/perl to add the "" for this solution
    – yael
    2 days ago












  • @yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
    – Kusalananda
    2 days ago










  • ok , so maybe I will post another question for how to add "n" on the last line
    – yael
    2 days ago






  • 1




    @yael How to add a newline to the end of a file?
    – Kusalananda
    2 days ago













up vote
6
down vote



accepted







up vote
6
down vote



accepted






Your input text contains an incomplete line as its last line. The last line is not terminated by a newline.



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


The above loop will read unmodified lines (without stripping whitespaces or interpreting backslashed control sequences) from the file called file and print them to standard output.



When an incomplete line is read, read will fail, but $line will still contain data. The extra -n test will detect this so that the loop body is allowed to output the incomplete line. In the iteration after that, read will fail again and $line will be an empty string, thus terminating the loop.






share|improve this answer












Your input text contains an incomplete line as its last line. The last line is not terminated by a newline.



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


The above loop will read unmodified lines (without stripping whitespaces or interpreting backslashed control sequences) from the file called file and print them to standard output.



When an incomplete line is read, read will fail, but $line will still contain data. The extra -n test will detect this so that the loop body is allowed to output the incomplete line. In the iteration after that, read will fail again and $line will be an empty string, thus terminating the loop.







share|improve this answer












share|improve this answer



share|improve this answer










answered 2 days ago









Kusalananda

116k15218352




116k15218352












  • the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
    – yael
    2 days ago










  • so if need to add "n on the last line , then need sed/perl to add the "" for this solution
    – yael
    2 days ago












  • @yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
    – Kusalananda
    2 days ago










  • ok , so maybe I will post another question for how to add "n" on the last line
    – yael
    2 days ago






  • 1




    @yael How to add a newline to the end of a file?
    – Kusalananda
    2 days ago


















  • the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
    – yael
    2 days ago










  • so if need to add "n on the last line , then need sed/perl to add the "" for this solution
    – yael
    2 days ago












  • @yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
    – Kusalananda
    2 days ago










  • ok , so maybe I will post another question for how to add "n" on the last line
    – yael
    2 days ago






  • 1




    @yael How to add a newline to the end of a file?
    – Kusalananda
    2 days ago
















the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
– yael
2 days ago




the script is only example of the problem , actually I set the echo in the script to show this issue , but what we need is how to set the last line with "n" with sed for example, since the the - file is already exists
– yael
2 days ago












so if need to add "n on the last line , then need sed/perl to add the "" for this solution
– yael
2 days ago






so if need to add "n on the last line , then need sed/perl to add the "" for this solution
– yael
2 days ago














@yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
– Kusalananda
2 days ago




@yael You say in the question that you use a loop like the one you are showing. I gave a solution for how to fix that loop. It does not matter what the body of the loop looks like, $line will be each individual line of the file, including the last incomplete one. If you don't use a loop like this, what do you use?
– Kusalananda
2 days ago












ok , so maybe I will post another question for how to add "n" on the last line
– yael
2 days ago




ok , so maybe I will post another question for how to add "n" on the last line
– yael
2 days ago




1




1




@yael How to add a newline to the end of a file?
– Kusalananda
2 days ago




@yael How to add a newline to the end of a file?
– Kusalananda
2 days ago


















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f482517%2fwhy-does-this-while-loop-not-recognize-the-last-line%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Paul Cézanne

UIScrollView CustomStickyHeader Resize height generates problems when scroll is too fast

Angular material date-picker (MatDatepicker) auto completes the date on focus out