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表示试图从中获得任何意义。