Answers:
使用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
,都吸收空白,包括\n
使用其他方法(如readarray
)出现的最终值的尾部)
Bash FAQ讨论了这一点,以及如何处理各种类似情况:
就像其他答案一样,它-d
是行尾字符,而不是字段分隔符。你可以做
IFS=, read -a fields <<< "1,2,3,4,5"
for i in "${fields[@]}"; do echo "$i"; done
来自人:
-d德林
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
read -d, i || [[ -n $i ]]
一拉是什么while read -r line || [[ -n $line ]]
意思?