shell脚本不读取sysin的最后一行

时间:2016-05-07 17:36:02

标签: bash shell stdin sysin

我尝试从sysin获取一些数据,这是我的问题:如果数据来自文件,则不读取最后一行。 文本文件示例:

line1
line2
line3

我的代码:

#!/bin/bash
while read line
do
  echo "$line"
done

输出:

$ ./test.sh < data.txt
line1
line2

如果我在我的文件末尾写下空字符串输出正确。但我不喜欢它。  如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

这个成语是:

while read -r line || [[ $line ]]; do
  : process "$line"
done

因此,我们继续循环,而

  • 我们读了一行有效的文字(需要换行)
  • 我们进行了部分阅读(导致非零退出状态,但保留变量非空)。

答案 1 :(得分:1)

如果你需要拼命读取没有EOL的文件,那么你可以检查返回的字符串是否为空而不是检查public void onError(int error)退出状态:

read

答案 2 :(得分:0)

我敢打赌,data.txt缺少一个尾随换行符,请尝试使用

进行检查
od -xa data.txt

看看结尾:

$ od -xa data.txt
0000000    696c    656e    0a31    696c    656e    0a32    696c    656e
          l   i   n   e   1  nl   l   i   n   e   2  nl   l   i   n   e
0000020    0033
          3
0000021

如果您看到上述内容,则错过换行符。

$ od -xa data-with-nl.txt
0000000    696c    656e    0a31    696c    656e    0a32    696c    656e
          l   i   n   e   1  nl   l   i   n   e   2  nl   l   i   n   e
0000020    0a33
          3  nl
0000022

如果缺少尾随换行符,有些shell也会显示%符号,请尝试:

$ cat data.txt
line1
line2
line3%
$