使用命令输出中引用的条目在 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"
我相信正在发生的事情是 "foo
和 bar"
在标准输出中被认为是单独的项目,但目标是将这些项目合并为一个数组。
显然,我可以编写一个小循环将这些术语合并为一个,但我想知道是否有更优雅的解决方案?
编辑:在我的代码中代替 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)
好多了 ;)
我在从标准输出形成 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"
我相信正在发生的事情是 "foo
和 bar"
在标准输出中被认为是单独的项目,但目标是将这些项目合并为一个数组。
显然,我可以编写一个小循环将这些术语合并为一个,但我想知道是否有更优雅的解决方案?
编辑:在我的代码中代替 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)
好多了 ;)