尾随换行符和bash';阅读';内置
在bash中,这是有效的:尾随换行符和bash';阅读';内置,bash,shell,newline,built-in,Bash,Shell,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中的帮助阅读,并没有真正阐明这一
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中的帮助阅读
,并没有真正阐明这一点
注意:我不需要解决这个问题,我可以自己找到一些解决方法。我很好奇,我很想提交一份bug报告——我通常会尽力尊重那些可能没有后续新行的文件。我在使用-d选项阅读时遇到了这个问题read-d”“
将在空格而不是换行符上拆分,但它将错过最后一个条目,除非它有一个尾随空格
(Ubuntu.gnubash,版本4.1.5(1)-发布)
我认为关键是:如何定义“一行”
结尾没有“\n”的
文本是否构成一行?
我想读取
不要这样认为。如果希望上面的循环处理不完整的行,请执行以下操作:
echo -n $'a\nb\nc' | while read x || [[ $x ]]; do echo = $x =; done
其中:
= a =
= b =
= c =
当read
遇到不完整的行时,它会将其读入变量(x
,在本例中),但会返回一个非零的退出代码,该代码将结束循环,|[[$x]]
也负责为不完整的行运行循环。下次调用read
时,没有要读取的内容,它以1退出,同时将x
设置为空字符串,这确保了循环结束
相关的
我的文本编辑器认为这是一条线,我认为每个文本编辑器都会。因此,如果文本编辑器能够明智地处理没有换行符作为最后一个字符的文件,那么我认为read
也应该:-)无论如何,您的第二个脚本与ksh的第一个脚本一样有效。祝你好运。我刚刚检查过:ksh
的行为与bash
在本例中的行为相同,@shellter@codefrester:我确信我在发布之前已经测试过了,但现在已经无法访问UWIN ksh93了。此外,我使用的版本可能与您使用的版本不同,尽管我几乎可以肯定我在UWIN/ksh电子邮件组中看到了这个问题(~
= a =
= b =
= c =