Bash Read:读取逗号分隔列表,最后一个元素丢失

Bash Read:读取逗号分隔列表,最后一个元素丢失

下面命令的输出对我来说很奇怪。为什么它不给我返回元素 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"; }

(即使使用-dread也使用,吸收空白,包括使用其他方法(例如 )出现的最终值的$IFS尾随)\nreadarray

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

相关内容