Bashを読む:カンマで区切られたリストを読み込んでいますが、最後の要素がありません。

Bashを読む:カンマで区切られたリストを読み込んでいますが、最後の要素がありません。

以下のコマンドの出力が奇妙に見えます。なぜ要素5を返さないのですか?

$ echo '0,1,2,3,4,5' | while read -d, i; do echo $i; done
0
1
2
3
4

「5」も返されると予想されます。ランニングGNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)。カンマを追加すると機能しますが、入力データにカンマはありません。私は何を逃したことがありませんか?

答え1

とともにread-d次のために使用されます終了入力ライン(つまり、入力ラインを外さないでください)。最後の「行」には終端が含まれていないため、readEOFからfalseが返され、ループが終了します(最終値を読み取っても)。

echo '0,1,2,3,4,5' | { while read -d, i; do echo "$i"; done; echo "last value=$i"; }

(使用しても、他の方法-dread使用して表示される$IFS末尾の最終値を含むスペースを吸収します。はい)\nreadarray

Bash FAQでは、この問題とさまざまな同様の状況を処理する方法について説明します。

答え2

他の回答で述べたように、-dフィールド区切り文字ではなく行末文字です。あなたはできます

IFS=, read -a fields <<< "1,2,3,4,5"
for i in "${fields[@]}"; do echo "$i"; done

答え3

男性の場合:

-d 区切り

delim の最初の文字は、改行文字ではなく入力行を終了するために使用されます。

要素5には区切り文字(カンマ)がないため、読み取れません。

答え4

あなたが見ている行動は次のとおりです。この「while」ループが最後の行を認識しないのはなぜですか?

この場合、次のようにループ終了条件に追加のテストを追加して動作を変更できます。

while read -d, i || [[ -n $i ]]; do ...

前任者。

$ echo '0,1,2,3,4,5' | while read -d, i || [[ -n $i ]]; do echo $i; done
0
1
2
3
4
5

関連情報