Bash読み取り:カンマ区切りリストの読み取り、最後の要素が欠落しています


8

以下のコマンドの出力は私には奇妙です。なぜ要素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)ます。コンマの追加は機能しますが、入力データにコンマがありません。何か不足していますか?

回答:


12

するために使用される終了(すなわちない別個の入力ラインに)入力ラインを。最後の「行」にはターミネータが含まれていないため、EOFでfalseを返し、ループは終了します(最終値が読み取られた場合でも)。read-dread

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

(でも-dreadも使用し$IFS\nなどのその他の方法を使用して表示される最終値の末尾を含む空白を吸収しますreadarray

Bash FAQでは、これと、さまざまな類似のケースを処理する方法について説明しています。


8
私は1つを行うことができると思いread -d, i || [[ -n $i ]]どういうwhile read -r line || [[ -n $line ]]意味ですか?
鋼製ドライバー、

8

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

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

5

男から:

-d delim

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

エレメント5には区切り文字(コンマ)がないため、読み取られません。


したがって、最良の修正は、入力の後に別のコンマを置くことですか?
Karlo、

3
最高の修正はシェル以外のものを使用してデータを処理するかもしれません。ここで回答者が現在の質問に対処したので、より大きな目標を示す別の質問を検討するかもしれません。
ジェフシャラー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.