我试图用字符串变量(数组在这里)替代,但出现错误。任何人都可以建议如何解决此问题?将字符串变量替换为数组名称
COMP="MY"
MY_common_sections_to_fix=(\
".rodata" \
".data" \
)
echo ${${COMP}_common_sections_to_fix[@]}
错误:
$ {$ {} COMP _common_sections_to_fix [@]}:坏替代
我试图用字符串变量(数组在这里)替代,但出现错误。任何人都可以建议如何解决此问题?将字符串变量替换为数组名称
COMP="MY"
MY_common_sections_to_fix=(\
".rodata" \
".data" \
)
echo ${${COMP}_common_sections_to_fix[@]}
错误:
$ {$ {} COMP _common_sections_to_fix [@]}:坏替代
你正在试图做的是间接引用数组什么。
一个nameref,如果你有一个足够新壳(4.3或更高版本),是这项工作的最合适的工具:
COMP=MY
MY_common_sections_to_fix=(.rodata .data)
declare -n active_sections=${COMP}_common_sections_to_fix
printf '%s\n' "${active_sections[@]}"
这使得active_sections
一个别名MY_common_sections_to_fix
,妥善发出.rodata
和.data
作为输出。
如果不有bash的4.3可用,两轮牛车与eval
是可用的(虽然是不幸的)选项:
printf -v cmd '%q=("${%q[@]}")' active_sections "${COMP}_common_sections_to_fix"
eval "$cmd"
...'COMP =“L1CC”'...... –
Eh,他们在问题的变量名称中使用了“我的”。他们使用这两个值,这意味着要么同样正确 - 需要修改其中一个或另一个来生成一个工作示例。 –
我以为他们试图让它成为'L1CC_common_sections_to_fix',但也许不是。如果我取出'-n'选项,第一个命令与3.x一起工作。 –
bash的哪个版本? 4.4中有一个方便的内置函数。 –
由于您初始化的数组是“MY_common_sections_to_fix”,但您试图访问“L1CC_common_sections_to_fix”,这是一个不出人意料的级别。但是,变量的动态命名也是有问题的。你可以创建一个变量来保存'MY_common_sections_to_fix',并找出如何利用'$ {!varname [@]}'或其附近 - 未经测试,但是'$ {var}'引用变量的名称存储在'$ var'中。 (半测试:结果看起来并不乐观,假设它不会工作,直到另行通知!) –
进一步注意:它不起作用 - 请参阅[shell参数扩展](https://www.gnu.org /software/bash/manual/bash.html#Shell-Parameter-Expansion)。它看起来像你不能做数组名称的间接扩展。 –