Bash:猫和回声之间的区别

Mar*_*ari 6 bash

这是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呢?

Bai*_*ang 8

因为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 另一方面,如果没有消息,则在回显消息时将始终添加新行.

  • @Joe wc -l不太适合检测到这一点:如果没有训练它会显示3 \n - `od -c`是确认是否有\n的好方法\n - 感谢提示. (2认同)

Ale*_*-A. 7

其他答案是正确的,您的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 循环。