以下のコマンドの出力は私には奇妙です。なぜ要素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)
を実行しています。コンマの追加は機能しますが、入力データにコンマがありません。何か不足していますか?
read
では、_-d
_を使用して入力行を終了します(つまり、入力行を分離しません)。最後の「行」にはターミネータが含まれていないため、read
はEOFでfalseを返し、ループは終了します(最終値が読み取られた場合でも)。
_echo '0,1,2,3,4,5' | { while read -d, i; do echo "$i"; done; echo "last value=$i"; }
_
(_-d
_を使用しても、read
は_$IFS
_も使用し、readarray
などの他のメソッドを使用して表示される最終値の末尾の_\n
_を含む空白を吸収します)
Bash FAQは、これと、同様のさまざまなケースを処理する方法について説明しています。
他の回答が述べるように、-d
は、フィールド区切り文字ではなく、行末文字です。できるよ
IFS=, read -a fields <<< "1,2,3,4,5"
for i in "${fields[@]}"; do echo "$i"; done
男から:
-d delim
Delimの最初の文字は、改行ではなく入力行を終了するために使用されます。
エレメント5には区切り文字(コンマ)がないため、読み取られません。
あなたが見ているのは と同じ振る舞いです(そして同じ理由で)この「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