使用命令输出中引用的条目在 Bash 中创建数组

Creating an Array in Bash with Quoted Entries from Command Output

我在从标准输出形成 bash 数组时遇到问题。我把它归结为这个最小的例子:

~$ a=($(echo '1 2 3 "foo bar"'))
~$ echo ${a[0]}
1
~$ echo ${a[1]}
2
~$ echo ${a[2]}
3
~$ echo ${a[3]}
"foo
~$ echo ${a[4]}
bar"

我相信正在发生的事情是 "foobar" 在标准输出中被认为是单独的项目,但目标是将这些项目合并为一个数组。

显然,我可以编写一个小循环将这些术语合并为一个,但我想知道是否有更优雅的解决方案?

编辑:在我的代码中代替 echo '1 2 3 "foo bar"' 的内容相当复杂,但关键是 我需要形成一个数组来自这种形式的一些未知标准输出.

进程替换不仅没有必要,而且直接有害。你要

a=(1 2 3 "foo bar")

如果您知道预期有多少项目,就可以做到

read a b c d <<<$(echo '1 2 3 "foo bar"')

最终,我猜你是逃不掉的eval

xargs 识别引号所以

mapfile -t a <<<"$(echo '1 2 3  "foo bar"' | xargs -n 1)"
printf "%s\n" "${a[@]}"
1
2
3
foo bar

你可以替换

some unknown standard output of this form

并通过 mapfile 命令将行读入数组。

例如,这可以通过 perl 完成,它的核心模块如下:

some_command() { echo '1 2 3 "foo bar"'; }

echo "output from some_command"
some_command

echo
echo "Parsed into array"
mapfile -t array < <(some_command | perl -MText::ParseWords -lnE 'say for shellwords($_)')
printf '=%s=\n' "${array[@]}"

打印什么

output from some_command
1 2 3 "foo bar"

Parsed into array
=1=
=2=
=3=
=foo bar=

编辑:刚刚识别出 1_CR 的答案。

mapfile -t array < <(some_command | xargs -n 1)

好多了 ;)