创建数组:直接在源中的文本与字符串

Creating an array: text directly in source vs a string

当执行以下代码时,输​​出是我预期的:

$ foo=(a b "c d") && for p in "${foo[@]}"; do echo $p; done
a
b
c d

但是当初始化器来自一个字符串时,例如像这样:

$ foo=($(echo "a b \"c d\"")) && for p in "${foo[@]}"; do echo $p; done
a
b
"c
d"

所以输出不同,而我希望这两个命令执行相同的操作。为什么这两种方式不等价,我怎样才能得到初始化器来自字符串的变体,其工作方式与直接初始化相同?

方法如下:

str='a b "c d"'
eval "foo=($str)"
printf "%s\n" "${foo[@]}"

我要去洗澡了