2016-05-07 13 views
-1

sysinからデータを取得しようとしましたが、私の問題です。データがファイルから出力された場合、最後の行は読み込まれません。テキストファイルの 例:シェルスクリプトはsysinから最後の行を読み込みません

line1 
line2 
line3 

マイコード:

#!/bin/bash 
while read line 
do 
    echo "$line" 
done 

そして出力:

$ ./test.sh < data.txt 
line1 
line2 

私は正しい私のファイルのヌル文字列の出力の最後に書き留めた場合。しかし、私はそれが好きではありません。 これを修正するには?最後に

+0

これには重複**があります。既存の回答済みの質問を検索しようとしましたか?参照:http://stackoverflow.com/questions/15485555/read-last-line-of-file-in-bash-script-when-reading-file-line-by-line、http://stackoverflow.com/questions/4165135/bash-to-read-the-last-in-a-file-if-there-s-no-newを使用して、読み込み中に使用する方法、http://stackoverflow.com/questions/16627578/bash-iterating-through-txt-file-lines-cant-read-last-line –

+0

私の不注意に申し訳ありません – Nawy

答えて

1

あなたが最後にEOLせずにファイルを読み取るために必死に必要がある場合は、あなたが返されるかどうかの文字列をチェックして代わりにread終了ステータスをチェックする空か:

#!/bin/bash 
while true; do 
    line='' 
    read line 
    if [ -z "$line" ]; then 
    break 
    fi 
    echo "$line" 
done 
+0

Worksですが、かなり冗長である必要があります。 –

0

私は

od -xa data.txt 

でチェックしてみてください、あなたはそのdata.txtをの末尾に改行が欠落している賭けるルック:

$ od -xa data.txt 
0000000 696c 656e 0a31 696c 656e 0a32 696c 656e 
      l i n e 1 nl l i n e 2 nl l i n e 
0000020 0033 
      3 
0000021 

あなたがあなたの上に表示された場合は、改行が欠落しています。

末尾に改行が欠落している場合、一部のシェルでも %記号が表示されます
$ od -xa data-with-nl.txt 
0000000 696c 656e 0a31 696c 656e 0a32 696c 656e 
      l i n e 1 nl l i n e 2 nl l i n e 
0000020 0a33 
      3 nl 
0000022 

、試してみてください。

$ cat data.txt 
line1 
line2 
line3% 
$ 
+0

まさに!しかし、どのように私のcodethis状況を変更するには? EOFでファイルを読み終える方法は? – Nawy

+0

@Nawy何ですか?あなたは 'data.txt'に改行を加えたいですか? – andlrc

+0

いいえ、私はしません。ファイルの最後に改行なしのファイルを処理したいだけです。 – Nawy

2

このためイディオムは次のとおりです。

私たちは、私たちがゼロになり、部分的読み取りを(持っていた(改行が必要です)テキストの有効な行
  • を読ん

    • :どちらかながら
      while read -r line || [[ $line ]]; do 
          : process "$line" 
      done 
      

      はこのように、我々はループに進みます終了状態ですが、変数は空ではありません)。

  • 関連する問題