bash中关联数组的动态名称

时间:2018-08-15 07:17:18

标签: bash associative-array dynamic-variables

我需要在bash中的几个不同的关联数组上执行相同的操作。因此,我想使用函数来避免代码重复。但是,我在访问函数内部的数据时遇到麻烦。这是一个简单的示例:

#!/bin/bash

# this function works fine
function setValue() {
    # $1  array name
    # $2  array index
    # $3  new value
    declare -g $1[$2]=$3
}

# this function doesn't
function echoValue() {
    # $1  array name
    # $2  array index
    echo ${$1[$2]}
}

declare -A arr1=( [v1]=12 [v2]=31 )
setValue arr1 v1 55
echoValue arr1 v2

我尝试了$ {$ 1 [$ 2]},$ {!1 [!2]}和所有其他可能的组合,但是这些都不起作用。如何在数组名称和索引均为动态而不是硬编码的情况下访问这些值?我将在这里为您提供任何建议。

3 个答案:

答案 0 :(得分:1)

间接参数扩展需要数组名称和索引在一起

echoValue () {
    # $1  array name
    # $2  array index
    t="$1[$2]"
    echo "${!t}"
}

答案 1 :(得分:0)

在Bash中,可以在函数外部声明的变量用作全局变量。这意味着您可以从bash函数内部调用/访问它们,而无需在函数内部将变量作为参数传递。

一个例子:

#!/bin/bash

function setValue() {
  arr1[v1]=55 
}

function echoValue() {  
    echo ${arr1[v2]} 
}

declare -A arr1=( [v1]=12 [v2]=31 )  
setValue 
echoValue

echo ${arr1[*]}

输出为:

31
31 55

我建议您看一下此Bash Variable Tutorial

答案 2 :(得分:0)

另一种解决方案

函数echovalue() {     本地str     str =“ echo”'$'“ {$ 1”“ [$ 2]}”     评估$ str }