【问题标题】:Trailing newlines and the bash 'read' builtin尾随换行符和 bash 'read' 内置
【发布时间】:2012-01-25 19:20:06
【问题描述】:

在 bash 中,这是有效的:

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

while循环了3次

= 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)-发布)

【问题讨论】:

  • 对于它的价值,你的第二个脚本作为第一个与 ksh 一起工作。祝你好运。
  • 我刚刚检查过:ksh 在这种情况下与bash 的行为方式相同,@shellter。
  • @codeforester :我确定我在发布之前对此进行了测试,但不再能够访问 UWIN ksh93。我使用的版本也可能与您使用的版本不同,尽管我几乎可以肯定我在 UWIN/ksh 电子邮件组中看到了这个问题(~

标签: bash shell newline built-in


【解决方案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 不这么认为。

【讨论】:

  • 我的文本编辑器认为它是一行,我认为每个文本编辑器都会。因此,如果文本编辑器可以明智地处理没有换行符作为最后一个字符的文件,那么我认为 read 也应该:-)
【解决方案2】:

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

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

给出:

= a =
= b =
= c =

read 遇到不完整的行时,它确实将其读入变量(在这种情况下为x),但返回一个非零退出代码以结束循环,|| [[ $x ]] 负责运行循环不完整的行。下次调用 read 时,没有什么可读取的,它以 1 退出,同时将 x 设置为空字符串,这样可以确保我们结束循环。


相关

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2013-02-10
    • 2011-04-01
    • 2021-12-29
    • 2017-03-01
    相关资源
    最近更新 更多