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

Aar*_*aid 7 bash shell newline built-in

在 bash 中,这是有效的:

echo -n $'a\nb\nc\n' | while read x; do echo = $x =; done
Run Code Online (Sandbox Code Playgroud)

while循环3次

= a =
= b =
= c =
Run Code Online (Sandbox Code Playgroud)

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

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

= a =
= b =
Run Code Online (Sandbox Code Playgroud)

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

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

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

cod*_*ter 9

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

echo -n $'a\nb\nc' | while read x || [[ $x ]]; do echo = $x =; done
Run Code Online (Sandbox Code Playgroud)

这使:

= a =
= b =
= c =
Run Code Online (Sandbox Code Playgroud)

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


有关的


kev*_*kev 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, ...
Run Code Online (Sandbox Code Playgroud)

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