Bash 将字符串变量替换为数组的名称

Bash 将字符串变量替换为数组的名称,bash,Bash,我试图替换一个字符串变量(这里是一个数组),但我得到了一个错误。有人能建议如何解决这个问题吗 COMP="MY" MY_common_sections_to_fix=( \ ".rodata" \ ".data" \ ) echo ${${COMP}_common_sections_to_fix[@]} 错误: ${${COMP}u common_sections_to_fix[@]}:错误的替换您试图做的是间接引用数组 如果您有足够新的shell(4

我试图替换一个字符串变量(这里是一个数组),但我得到了一个错误。有人能建议如何解决这个问题吗

COMP="MY"

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

 echo ${${COMP}_common_sections_to_fix[@]}
错误:


${${COMP}u common_sections_to_fix[@]}:错误的替换

您试图做的是间接引用数组

如果您有足够新的shell(4.3或更高版本),nameref是最适合此作业的工具:

COMP=MY
MY_common_sections_to_fix=( .rodata .data )
declare -n active_sections=${COMP}_common_sections_to_fix
printf '%s\n' "${active_sections[@]}"
这使
活动\u节
成为
我的公共\u节_至_修复
的别名,并正确地将
.rodata
数据
作为输出


如果您没有可用的bash 4.3,那么使用
eval
的hackery是一个可用的选项(尽管很不幸):


您试图做的是间接引用数组

如果您有足够新的shell(4.3或更高版本),nameref是最适合此作业的工具:

COMP=MY
MY_common_sections_to_fix=( .rodata .data )
declare -n active_sections=${COMP}_common_sections_to_fix
printf '%s\n' "${active_sections[@]}"
这使
活动\u节
成为
我的公共\u节_至_修复
的别名,并正确地将
.rodata
数据
作为输出


如果您没有可用的bash 4.3,那么使用
eval
的hackery是一个可用的选项(尽管很不幸):


哪个版本的bash?4.4中提供了一个方便的内置程序。由于您初始化的数组是
MY\u common\u sections\u to\u fix
,但您正在尝试访问
L1CC\u common\u sections\u to\u fix
,这是一个非意外级别。然而,变量的动态命名也有问题。您可以创建一个包含
MY\u common\u sections\u to\u fix
的变量,并了解如何利用
${!varname[@]}
或其附近的未测试变量,但是
${!var}
引用了存储在
$var
中的名称的变量。(半测试:结果看起来不太有希望。假设在进一步通知之前它不会工作!)进一步通知:它不会工作-请参阅Bash手册中的。看起来无法间接扩展数组名。介绍哪些间接引用技巧在哪些shell上可用,以及哪些适用于数组。请注意本节最后一个示例附带的注意事项,作为一个示例,说明在没有相关功能的shell中执行此操作有多么容易出错。哪个版本的bash?4.4中提供了一个方便的内置程序。由于您初始化的数组是
MY\u common\u sections\u to\u fix
,但您正在尝试访问
L1CC\u common\u sections\u to\u fix
,这是一个非意外级别。然而,变量的动态命名也有问题。您可以创建一个包含
MY\u common\u sections\u to\u fix
的变量,并了解如何利用
${!varname[@]}
或其附近的未测试变量,但是
${!var}
引用了存储在
$var
中的名称的变量。(半测试:结果看起来不太有希望。假设在进一步通知之前它不会工作!)进一步通知:它不会工作-请参阅Bash手册中的。看起来无法间接扩展数组名。介绍哪些间接引用技巧在哪些shell上可用,以及哪些适用于数组。请注意本节最后一个示例附带的注意事项,这是一个示例,说明在没有相关功能的shell中执行此操作时容易出错。呃,他们在问题的变量名中使用了“MY”。他们使用两个值,这意味着两者都是同样正确的——一个或另一个需要修改以生成一个工作示例。我以为他们试图使它成为
L1CC\u common\u sections\u to\u fix
,但可能不是。如果我去掉
-n
选项,第一个命令将与3.x一起工作。@l'l,嗯?在3.x中,如果删除了
-n
,则会得到
声明--active\u sections=“MY\u common\u sections\u to\u fix”
,这意味着只有目标变量的名称可用,而不是它的值可用。实际上,我不知道OP试图做什么,因此+1试图从中获得任何意义。呃,他们使用了“MY”在问题中的变量名中。他们使用两个值,这意味着两者都是同样正确的——一个或另一个需要修改以生成一个工作示例。我以为他们试图使它成为
L1CC\u common\u sections\u to\u fix
,但可能不是。如果我去掉
-n
选项,第一个命令将与3.x一起工作。@l'l,嗯?在3.x中,如果删除了
-n
,则会得到
declare--active\u sections=“MY\u common\u sections\u to\u fix”
,这意味着只有目标变量的名称可用,而不是它的值可用。实际上,我不知道OP试图做什么,因此+1表示试图从中获得任何意义。