如果在使用read时未使用新行char(\n)终止,则尊重最后一行

mic*_*yer 8 bash shell built-in

我注意到有一段时间,read如果没有文件的最后一行,那么它最后就不会读取一个"换行符".如果考虑到这一点,这是可以理解的,只要文件中没有"换行"字符,就好像它包含0行(这很难承认!).例如,请参阅以下内容:

$ echo 'foo' > bar ; wc -l bar
1 bar
Run Code Online (Sandbox Code Playgroud)

但...

$ echo -n 'bar' > foo ; wc -l foo
0 foo
Run Code Online (Sandbox Code Playgroud)

那么问题是:当我使用read处理尚未由我自己创建或修改的文件时,如何处理这种情况,以及我不知道它们是否真的以"换行符"结尾?

kop*_*hke 15

read事实上,将未终止的行读入指定的var($REPLY默认情况下).它也在这样一行上返回false,这意味着"文件结束"; 直接在经典while循环中使用其返回值,从而跳过最后一行.如果稍微更改循环逻辑,则可以正确处理非新行终止文件,而无需事先进行预防,具有read:

while read -r || [[ -n "$REPLY" ]]; do
    # your processing of $REPLY here
done < "/path/to/file"
Run Code Online (Sandbox Code Playgroud)

请注意,这比依赖外部的解决方案要快得多.

Gordon Davisson提示改进循环逻辑.

  • 这不太有效,因为如果文件以换行符结束,它将在REPLY设置为""时运行循环额外的时间.使用`while read -r || [-n"$ REPLY"]; 改为做. (2认同)