2017-06-21 53 views
0

我试图用字符串变量(数组在这里)替代,但出现错误。任何人都可以建议如何解决此问题?将字符串变量替换为数组名称

COMP="MY" 

MY_common_sections_to_fix=(\ 
     ".rodata" \ 
     ".data" \ 
    ) 

echo ${${COMP}_common_sections_to_fix[@]} 

错误:

$ {$ {} COMP _common_sections_to_fix [@]}:坏替代

+0

bash的哪个版本? 4.4中有一个方便的内置函数。 –

+0

由于您初始化的数组是“MY_common_sections_to_fix”,但您试图访问“L1CC_common_sections_to_fix”,这是一个不出人意料的级别。但是,变量的动态命名也是有问题的。你可以创建一个变量来保存'MY_common_sections_to_fix',并找出如何利用'$ {!varname [@]}'或其附近 - 未经测试,但是'$ {var}'引用变量的名称存储在'$ var'中。 (半测试:结果看起来并不乐观,假设它不会工作,直到另行通知!) –

+0

进一步注意:它不起作用 - 请参阅[shell参数扩展](https://www.gnu.org /software/bash/manual/bash.html#Shell-Parameter-Expansion)。它看起来像你不能做数组名称的间接扩展。 –

回答

2

你正在试图做的是间接引用数组什么。

一个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" 
+0

...'COMP =“L1CC”'...... –

+0

Eh,他们在问题的变量名称中使用了“我的”。他们使用这两个值,这意味着要么同样正确 - 需要修改其中一个或另一个来生成一个工作示例。 –

+0

我以为他们试图让它成为'L1CC_common_sections_to_fix',但也许不是。如果我取出'-n'选项,第一个命令与3.x一起工作。 –