这是file.txt
:
foo:bar:baz:qux:quux
one:two:tree:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
the quick brown fox jumps over the lazy dog
Run Code Online (Sandbox Code Playgroud)
这是我在终端尝试的:
user@notebook:~/Desktop$ cat file.txt
foo:bar:baz:qux:quux
one:two:tree:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
the quick brown fox jumps over the lazy dogmuser@notebook:~/Desktop$ cat read.sh
while read -r line
do
echo $line
done < file.txt
user@notebook:~/Desktop$ ./read.sh
foo:bar:baz:qux:quux
one:two:tree:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么不read.sh
显示最后一行的结果cat file.txt
呢?
因为file.txt中没有行尾,如果你:
$ od -c file.txt
0000000 f o o : b a r : b a z : q u x :
0000020 q u u x \n o n e : t w o : t r e
0000040 e : f o u r : f i v e : s i x :
0000060 s e v e n \n a l p h a : b e t a
0000100 : g a m m a : d e l t a : e p s
0000120 i l o n : z e t a : e t a : t e
0000140 t a : i o t a : k a p p a : l a
0000160 m b d a : m u \n t h e q u i c
0000200 k b r o w n f o x j u m p
0000220 s o v e r t h e l a z y
0000240 d o g
Run Code Online (Sandbox Code Playgroud)
\n
文件末尾没有.
echo
另一方面,如果没有消息,则在回显消息时将始终添加新行.
其他答案是正确的,您的file.txt
.
大多数文本编辑器会自动以换行符结束文件,即使nano
这样做也是如此。但是你的文件是由脚本生成的,对吧?要重现此行为,您只需:
echo -n 'hello world' >> file.txt
Run Code Online (Sandbox Code Playgroud)
-n
标志告诉 echo 不要输出尾随的换行符。
另外,如果您希望read
代码正常工作,可以使用以下命令:
while read -r line
do
printf "%s\n" "$line"
done < file.txt
[[ -n $line ]] && printf '%s' "$line"
Run Code Online (Sandbox Code Playgroud)
这将起作用,因为实际上read
会将最后一行放入变量中,但它也会返回false,从而破坏 while 循环。