【发布时间】:2017-09-10 16:34:46
【问题描述】:
下面有一些代码可以从列表中读取数组
#!/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,对吗?)。想知道这两个版本之间有什么变化
【问题讨论】:
-
顺便说一句,最好使用符合POSIX的
getlist() {声明语法,前面没有function;function就像let一样,是一种向后兼容的痕迹(在这种情况下是用于 ksh),与兼容(因此可移植)的替代品相比没有任何优势。 -
另外,
IFS=$' \n\t'比使用printf运行命令替换要高效得多。 (在 ksh93 中,shell 实际上并没有 fork 进行替换,只是在当前 shell 中运行 printf ——但 bash 没有这种优化)。
标签: bash