Bash Read:读取逗号分隔的列表,缺少最后一个元素


8

下面的命令输出对我来说很奇怪。为什么它不给我还元素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)。添加逗号是可行的,但是我的输入数据没有逗号。我想念什么吗?

Answers:


12

使用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,都吸收空白,包括\n使用其他方法(如readarray)出现的最终值的尾部)

Bash FAQ讨论了这一点,以及如何处理各种类似情况:


8
我想一个可以做read -d, i || [[ -n $i ]]一拉是什么while read -r line || [[ -n $line ]]意思?
钢铁司机



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.