在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) - 发布)
答案 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 end
会One line
吗?
我想read
不这么认为。