尾随换行符和bash'read'内置

时间:2011-12-22 02:57:50

标签: bash newline built-in

在bash中,这有效:

echo -n $'a\nb\nc\n' | while read x; do echo = $x =; done

while循环三次

= a =
= b =
= c =

但想象一下没有传统尾随换行符的文本文件。我认为read应该仍适用于所有三行,但事实并非如此。我得到:

echo -n $'a\nb\nc' | while read x; do echo = $x =; done

= a =
= b =

bash中的help read并没有真正澄清。

注意:我不需要解决此问题,我可以通过一些方法自行解决问题。我很好奇,我很想提交错误报告 - 我通常会尝试尊重可能没有尾随新行的文件。当使用-d选项读取时,我遇到了这个问题。 read -d " "将分隔空格而不是换行符,但除非它有尾随空格,否则它将错过最后一个条目。

(Ubuntu.GNU bash,版本4.1.5(1) - 发布)

2 个答案:

答案 0 :(得分:4)

如果您希望上述循环处理不完整的行,请执行以下操作:

echo -n $'a\nb\nc' | while read x || [[ $x ]]; do echo = $x =; done

给出:

= a =
= b =
= c =

read 遇到不完整的行时,它确实将其读入变量(在本例中为 x)但返回一个非零退出代码以结束循环,并且 {{1} } 也负责运行不完整行的循环。下次调用 || [[ $x ]] 时,没有任何内容可读取并以 1 退出,同时将 read 设置为空字符串,以确保我们结束循环。


相关

答案 1 :(得分:1)

$ man bash
   read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
          One line is read from the standard input, ...

我认为关键是:How to define "One line" text without a '\n' at the endOne line吗? 我想read不这么认为。