Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尾随换行符和bash';阅读';内置_Bash_Shell_Newline_Built In - Fatal编程技术网

尾随换行符和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中的帮助阅读,并没有真正阐明这一

在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 =