在bash中将数组定义为哈希表作为值

时间:2017-08-25 13:01:46

标签: arrays bash hash

我知道这对于编写脚本来说几乎太复杂了,但请耐心等待。

我知道如何声明数组:

arr=(hello world)
echo ${arr[1]} # "world"

我知道你可以在bash中使用哈希映射:

declare -A map=([hello]=world [foo]=bar)
echo ${map[hello]} # "world"

但是你可以在bash中使用数组作为值的哈希映射吗?我已经尝试了几种语法,但通常我得到一个哈希映射,其中有空格分隔的字符串列表作为与哈希关联的值

编辑:

示例:我想为cmdline工具toolNew编写适配器toolOld。两者都打印出一些有关系统的信息。

toolOld可以使用九个不同的参数a1a2a3b1,...或c3想简化。

即。 toolNew只需要三个不同的参数abc

(imo)最干净的方法是拥有一个功能

toolNew() {
    newArgument="$1"
    for argument in "${argumentMap[newArgument][@]}"; do
        toolOld "$argument"
    done
}

1 个答案:

答案 0 :(得分:0)

如果您使用的是最新版本的bash,可以使用以下函数进行模拟:

  1. 创建可能是名称的数组变量,例如地图键和值的连接(helloworldfoobar ...)。
  2. 使用变量引用(declare -n)来引用它们。
  3. 示例:

    declare -A map=([hello]=world [foo]=bar)
    
    function set_entry ()
    {
        local key="$1"
        local val="${map[$1]}"
        declare -n entry="${key}${val}"
        entry[$2]=$3
    }
    
    get_entry ()
    {
        local key="$1"
        local val="${map[$1]}"
        declare -n entry="${key}${val}"
        echo "${key}${val}[$2]=${entry[$2]}"
    }
    
    declare -a helloworld=( 0 1 2 )
    declare -a foobar=( 3 4 5 )
    

    然后:

    $ get_entry hello 1
    helloworld[1]=1
    $ get_entry foo 0
    foobar[0]=3
    $ set_entry foo 0 7
    $ get_entry foo 0
    foobar[0]=7