-1

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

line1
line2
line3

我的代码:

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

并输出:

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

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

4

3 回答 3

2

这方面的成语是:

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

因此,我们在循环中继续,

  • 我们读取了一个有效的文本行(需要换行符)
  • 我们进行了部分读取(导致非零退出状态,但变量非空)。
于 2016-05-07T17:55:45.010 回答
1

如果你最后迫切需要读取没有 EOL 的文件,那么你可以检查返回的字符串是否为空,而不是检查read退出状态:

#!/bin/bash
while true; do
  line=''
  read line
  if [ -z "$line" ]; then
    break
  fi
  echo "$line"
done
于 2016-05-07T17:54:04.417 回答
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%
$
于 2016-05-07T17:46:43.963 回答