-1

sysin からデータを取得しようとしましたが、ここに問題があります。データがファイルから送信された場合、最後の行が読み取られません。テキストファイルの例:

line1
line2
line3

私のコード:

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

そして出力:

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

ファイルの最後に書き留めると、null 文字列が正しく出力されます。しかし、私はそれが好きではありません。これを修正する方法は?

4

3 に答える 3

2

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

while read -r line || [[ $line ]]; do
  : process "$line"
done

したがって、次のいずれかでループを続行します。

  • 有効なテキスト行を読み取ります (これには改行が必要です)
  • 部分的な読み取りがありました (ゼロ以外の終了ステータスになりますが、変数は空ではありません)。
于 2016-05-07T17:55:45.010 に答える
1

最終的に EOL なしでファイルを読み取る必要がある場合は、read終了ステータスを確認する代わりに、返された文字列が空かどうかを確認できます。

#!/bin/bash
while true; do
  line=''
  read line
  if [ -z "$line" ]; then
    break
  fi
  echo "$line"
done
于 2016-05-07T17:54:04.417 に答える
0

data.txt の末尾に改行がありません。確認してみてください。

od -xa 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%
$
于 2016-05-07T17:46:43.963 に答える