我在下面有一些代码从列表中读取数组
#!/usr/local/bin/bash
function getlist {
printf "%q/\n" "foo"
printf "%q/\n" "bar"
}
IFS="$(printf ' \n\t')"
# IFS=" "
while read -r tmp; do
echo "test"
echo $tmp
done <<< $(getlist)
4.2 bash输出
$ ./test.sh
test
foo/ bar/
4.4输出
$ ./test.sh
test
foo/
test
bar/
但是,如果我改变IFS =“”,它们的行为与4.4相同(但实际上分隔符是\ n,对吧?)。不知道这两个版本之间有什么变化
答案 0 :(得分:4)
问题不在于read
,而是你没有引用herestring。如果你引用它,你会得到4.4结果:
#!/usr/local/bin/bash
function getlist {
printf "%q/\n" "foo"
printf "%q/\n" "bar"
}
IFS="$(printf ' \n\t')"
# IFS=" "
while read -r tmp; do
echo "test"
echo $tmp
done <<< "$(getlist)"
它在bash 4.4中有所不同,因为它修复了与in the release notes中找到的文档的偏差:
ž。 Bash不再拆分here-strings的扩展,正如文档总是说的那样。