9

これは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

これは私がターミナルで試したものです:

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

私の質問は、なぜread.sh行末のように最後の行が表示さcat file.txtれないのですか?

4

4 に答える 4

10

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

\nファイルの最後にはありません。

echo一方、メッセージがない場合は、メッセージをエコーするときに常に新しい行が追加されます。

于 2013-09-08T04:03:27.847 に答える
4

入力ファイルが改行で終わっていません。

cat fileファイルの内容を標準出力にコピーするだけです。行ではなく文字で動作するため、ファイルが改行で終わるかどうかは気にしません。ただし、改行で終わらない場合、出力に追加されません。

read -r line変数に行を読み込みます。行が改行で終わる場合にのみ成功を報告します。入力の最後の行が改行で終わらない場合、EOF に達したかのようにエラーが報告されます。したがって、最後の行を読み取ろうとすると、その行を返すのではなく、ループが終了します。そのため、スクリプトは で始まる行を表示しませんthe quick brown fox

一般に、Unix テキスト ファイル プログラムは、改行で終わるテキスト ファイルでのみ機能するように定義されています。改行がない場合の最終行の扱いは、通常指定されていません。

于 2013-09-08T04:05:04.900 に答える
1

file.txt最終行の最後に改行が含まれていません。したがって、それcatを示しません。

read.shは最後の行をまったく表示しないことに注意してください... in はread.shread入力の完全な行を待っており、最後の行は改行で終了していないため、実際には読み取られません。

于 2013-09-08T04:05:45.590 に答える