2013-09-08 7 views
5

をエコーの違い:バッシュ:猫とこれが<code>file.txt</code>ある

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 

これは私がターミナルにしようとしたものです:

[email protected]:~/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 [email protected]:~/Desktop$ cat read.sh 
while read -r line 
do 
    echo $line 
done < file.txt 

[email protected]:~/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のようですか?

答えて

6

あなた場合は行の終わりは、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は、メッセージがない場合にメッセージをエコーするときに常に新しい行を追加します。

+0

これを確認するには、 'wc -l'が良い方法です。 'od -ta'は、改行文字がどこにあるかを示すためにも使われます。 – Joe

+1

@Joe wc -lはこれを検出するのにはあまり適していません。トレーニングがない場合は3を表示します。\ n - 'od -c'は、チップの有無を確認する良い方法です。 –

1

入力ファイルは改行で終了しません。

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

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

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

+0

'read'がエラーを返したときに、変数の内容を実際に見たことがないので、私はその区別を理解しませんでした。私は私の答えを更新しました。 – Barmar

0

file.txtには、最後の行の最後に改行が含まれていません。したがってcatには表示されません。 read.shがすべてで最後の行が表示されないことを... read.sh

注、readは、入力の完全なラインを待っている、それが実際に読まれていないので、最後の行は、改行で終了していないため。

4

その他の回答は正しいですが、あなたのfile.txtの末尾には改行文字がありません。

ほとんどのテキストエディタでは、自動的に改行を含むファイルが終了します。nanoでもそうです。しかし、あなたのファイルはスクリプトによって生成されました。 は、あなたがしなければならないすべてはこの現象を再現するには、次の

echo -n 'hello world' >> file.txt 

-nフラグは末尾に改行を出力しないエコー伝えます。実際readは、変数に最後の行を配置しますが、それはまた戻りますので、これは仕事に行くされて

while read -r line 
do 
    printf "%s\n" "$line" 
done < file.txt 
[[ -n $line ]] && printf '%s' "$line" 

:あなたが動作するようにあなたのreadコードをしたい場合

また、あなたはこれを使用することができますfalse、whileループを壊します。

関連する問題