【问题标题】:Modify global variable array through a bash function, passing the function the name of the variable as a string通过bash函数修改全局变量数组,将变量名作为字符串传递给函数
【发布时间】:2015-08-01 05:12:06
【问题描述】:

亲爱的,我需要一些东西来帮助我。我试图通过一个函数修改一个全局数组,使用一个名为“数组”的辅助变量。我想使用一个函数来修改全局数组“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

问候。

【问题讨论】:

    标签: arrays bash function multidimensional-array declare


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你几乎是对的,这样的事情应该可以工作:

      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"
      }
      

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

      【讨论】:

      • 不要在不知道$1 只是数组名称的情况下使用eval。您允许testABC 执行作为参数传递的任意代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2020-10-12
      • 2013-04-20
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多