我的剧本
export IFS=":"
cat hello | while read a b c d; do
echo $a,$b,$c,$d
done
我的档案hello
1:1:1:1
2:2:2:2
3:3:3:3
我的输出
1,1,1,1
2,2,2,2
如果我在3:3:3:3
hello
之后放一个空行,那么输出就会变为
1,1,1,1
2,2,2,2
3,3,3,3
任何人都知道我如何解决这个问题所以我不需要在hello
的末尾添加一个空行?
答案 0 :(得分:13)
当输入未以换行符终止时,read
命令失败。由于文件末尾缺少换行符,read
失败,因此跳过while
循环的最后一次迭代。
如果您不想/不能确保输入文件最后有换行符,可以将cat
与echo
分组,以提供外观由换行符终止的输入的em>,例如:
{ cat hello; echo; } | while read a b c d; do
echo $a,$b,$c,$d
done
或者像这样:
(cat hello; echo) | while read a b c d; do
echo $a,$b,$c,$d
done
答案 1 :(得分:6)
This is an extensive reading for the question why?
如果您不想在最后添加新行,可以执行以下操作:
while IFS=: read -r a b c d || [ -n "$a" ];
do
echo $a,$b,$c,$d;
done < file
或使用grep
:
while IFS=: read -r a b c d;
do
echo $a,$b,$c,$d;
done < <(grep "" filee)
注意:
答案 2 :(得分:5)
答案 3 :(得分:1)
很可能是由于输入文件中最后一行之后缺少换行符。
运行此命令以查找:
cat -vte hello
看看你得到了什么。
答案 4 :(得分:1)
您的文件可能在最后一行缺少换行符(\n
)。
您可以通过打印$a
等剩余值来证明这一点,如此
while IFS=: read a b c d;
do
echo $a,$b,$c,$d;
done < hello
echo $a,$b,$c,$d
修复文件。
此外,您应该能够专门为IFS
设置read
,如上所示。并且不需要cat
文件,只需使用输入重定向,如图所示