通过bash函数修改全局变量数组,将函数名称作为字符串传递给函数

时间:2015-08-01 05:12:07

标签: arrays bash function multidimensional-array declare

亲爱的,我需要一些东西来帮助我。我正在尝试使用名为“array”的辅助变量通过函数修改全局数组。我想使用一个带有变量“config”名称的字符串的函数来修改全局数组“config”。

我正在尝试以下但我没有得到结果。

declare -A config

function testABC {
    array=${1}[@]
    array["key"]="value1"
    array["key2"]="value2"
}

testABC "config"
echo ${config["key"]}
echo ${config["key2"]}

#desired output:
#value1
#value2

我的bash版本是4.2.45

问候。

2 个答案:

答案 0 :(得分:2)

使用printf -v设置值。这样可以避免eval的使用不安全,因为printf只能 将文本打印到命名变量中,仅此而已。

testABC () {
    printf -v "$1[key]" '%s' value1
    printf -v "$1[key2]" '%s' value2
}

请务必阅读http://mywiki.wooledge.org/BashFAQ/006(从中获取此答案),以便充分了解各种方法的缺点。 Shell语言不适合这种类型的编程。

答案 1 :(得分:1)

你几乎做对了,这样的事情应该有效:

function testABC {
  array="$1"
  # Don't proceed unless the argument is a valid identifier
  valid_id="^[[:alpha:]_][[:word:]]+$"
  [[ $array =~ $valid_id ]] || return

  eval "$array"["key"]="value1"
  eval "$array"["key2"]="value2"
}

我们将传递给函数的参数存储在数组变量中。之后,我们构造了为键分配值并使用eval的行。 eval$array替换"config"并执行整行,正确分配值。