С помощью read
-d
используется для завершения входных линий (, т.е. не для разделения входных строк ). Ваша последняя «строка» не содержит терминатора, поэтому read
возвращает false в EOF, и цикл завершается (, хотя последнее значение было прочитано ).
echo '0,1,2,3,4,5' | { while read -d, i; do echo "$i"; done; echo "last value=$i"; }
(Даже с -d
read
также использует $IFS
, поглощая пробелы, включая конечный \n
в конечном значении, которое появится при использовании других методов, таких какreadarray
)
В FAQ по Bash обсуждается это и как поступать в различных подобных случаях: