为什么unix在读取时没有读到最后一行?

Pop*_*orn 15 unix linux bash shell

我的剧本

export IFS=":"

cat hello | while read a b c d; do
    echo $a,$b,$c,$d
done
Run Code Online (Sandbox Code Playgroud)

我的档案 hello

1:1:1:1
2:2:2:2
3:3:3:3
Run Code Online (Sandbox Code Playgroud)

我的输出

1,1,1,1
2,2,2,2
Run Code Online (Sandbox Code Playgroud)

如果我3:3:3:3hello之后输入一个空行,则输出变为

1,1,1,1
2,2,2,2
3,3,3,3
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何解决这个问题,所以我不需要在结尾处加一个空行hello

Sto*_*ica 16

发生的事情是,read输入未以换行符终止时,命令失败.由于文件末尾缺少换行符read,因此失败,因此while跳过循环的最后一次迭代.

如果你不想/不能确保您的输入文件有在最后一个换行符,你可以将你catecho给予的外观被终止换行符的输入,例如像这样:

{ cat hello; echo; } | while read a b c d; do
    echo $a,$b,$c,$d
done
Run Code Online (Sandbox Code Playgroud)

或者像这样:

(cat hello; echo) | while read a b c d; do
    echo $a,$b,$c,$d
done
Run Code Online (Sandbox Code Playgroud)


Jah*_*hid 7

这是一个广泛阅读的问题为什么?

如果您不想在最后添加新行,则可以执行以下操作:

while IFS=: read -r a b c d || [ -n "$a" ]; 
do     
echo $a,$b,$c,$d; 
done < file
Run Code Online (Sandbox Code Playgroud)

或使用grep:

while IFS=: read -r a b c d; 
do     
echo $a,$b,$c,$d; 
done < <(grep "" filee)
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 没有必要使用cat with while循环.
  2. 您应该几乎总是将-r选项与read一起使用.


use*_*058 5

当且仅当它丢失时,存在一个不太知名的讨厌的黑客来向文本流添加缺少的最终换行符:

sed '$a\'
Run Code Online (Sandbox Code Playgroud)

例如,请参阅有关unix.stackexchange的讨论.

  • 有很多这些.其他包括`grep ^`,`awk 1`,`paste` (4认同)