我正在尝试使用命令的输出填充一个关联数组。如果没有命令,我可以这样做:
$ declare -A x=( [first]=foo [second]=bar )
$ echo "${x[first]}, ${x[second]}"
foo, bar
我可以使用以下命令将非关联数组填充为命令输出:
$ declare y=( $(echo 'foo bar') )
$ echo "${y[0]}, ${y[1]}"
foo, bar
但是,当我尝试在上述两者的基础上构建一个语句来从命令中填充关联数组时,我会收到以下错误消息:
$ declare -A z=( $(echo '[first]=foo [second]=bar') )
-bash: z: $(echo '[first]=foo [second]=bar'): must use subscript when assigning associative array
我为什么会收到那个错误消息,正确的语法是什么来填充一个关联数组与命令的输出?我试图避免使用eval(通常的原因),不想使用临时文件,当然,echo只是作为一个产生所需效果的命令的示例,实际命令会更加复杂。基于下面的几个答案,看起来问题只是我的引号有问题:
$ declare -A z="( $(echo '[first]=foo [second]=bar') )"
$ echo "${z[first]}, ${z[second]}"
foo, bar
并且在索引和值中带有空格:
$ declare -A z="( $(echo '[first field]="foo with space" [second]="space bar"') )"
$ echo "${z[first field]}, ${z[second]}"
foo with space, space bar
回应评论中的一个问题(如何使用命令输出填充Bash关联数组?),需要解释为什么引号是必要的 - 我不确定,但也许其他人可以使用此脚本的结果作为参考来解释(不希望在索引数组中使用指定的索引,它们只是作为字符串的一部分被填充为数组值):
$ cat tst.sh
#!/bin/env bash
set -x
printf 'Indexed, no quotes\n'
declare -a w=( $(echo '[first]=foo [second]=bar') )
declare -p w
printf '\n---\n'
printf 'Indexed, with quotes\n'
declare -a x="( $(echo '[first]=foo [second]=bar') )"
declare -p x
printf '\n---\n'
printf 'Associative, no quotes\n'
declare -A y="( $(echo '[first]=foo [second]=bar') )"
declare -p y
printf '\n---\n'
printf 'Associative, with quotes\n'
declare -A z=( $(echo '[first]=foo [second]=bar') )
declare -p z
.
$ ./tst.sh
+ printf 'Indexed, no quotes\n'
Indexed, no quotes
+ w=($(echo '[first]=foo [second]=bar'))
++ echo '[first]=foo [second]=bar'
+ declare -a w
+ declare -p w
declare -a w=([0]="[first]=foo" [1]="[second]=bar")
+ printf '\n---\n'
---
+ printf 'Indexed, with quotes\n'
Indexed, with quotes
++ echo '[first]=foo [second]=bar'
+ declare -a 'x=( [first]=foo [second]=bar )'
+ declare -p x
declare -a x=([0]="bar")
+ printf '\n---\n'
---
+ printf 'Associative, no quotes\n'
Associative, no quotes
++ echo '[first]=foo [second]=bar'
+ declare -A 'y=( [first]=foo [second]=bar )'
+ declare -p y
declare -A y=([second]="bar" [first]="foo" )
+ printf '\n---\n'
---
+ printf 'Associative, with quotes\n'
Associative, with quotes
+ z=($(echo '[first]=foo [second]=bar'))
./tst.sh: line 24: z: $(echo '[first]=foo [second]=bar'): must use subscript when assigning associative array
+ declare -A z
+ declare -p z
declare -A z=()
IFS=
,并且不能在整个内容周围使用$'...'
,否则它会将\t
转换为制表符等。但是,我们可能可以在每个数组元素之间获取文字换行符甚至 NUL 字符(并使用 NUL 标志读取)。还需要考虑一下,谢谢! - Ed Morton$REPLY
变量,则不需要使用IFS=
,但我想使用它也没有什么坏处。(已编辑) - anubhava