下面命令的输出对我来说很奇怪。为什么它不给我返回元素 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
用来终止输入线(即不分隔输入线)。您的最后一个“行”不包含终止符,因此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 讨论了这个问题,以及如何处理各种类似的情况:
答案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