2017-08-25 45 views
1

我知道这对于编写脚本的目的来说几乎太复杂了,但请耐心等待。定义散列表作为bash中的数组作为值

我知道你可以声明数组:

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

而且我知道,你可以在bash使用哈希映射:

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

但你可以有数组中值的哈希映射庆典?我已经尝试了几种语法,但通常我有一个哈希表,其中有空格分隔字符串列表作为与散列值

编辑:

举个例子:我想写一个适配器toolNew为一个cmdline工具toolOld。都只是打印出一些有关系统的信息。

toolOld可以采用九种不同的参数a1a2a3b1,...,或c3,我希望能够简化。

I.e. toolNew只需要三个不同的参数a,bc

这样做将有一个功能

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

你能给你的意思的例子吗? – 123

+4

编号数组在'bash'中不是一流的值。相反,shell提供了类似数组的语法,它基本上掩饰了类似命名变量的使用。 'ksh'确实允许嵌套数组,但是如果你需要这种类型的丰富的数据结构,shell以外的东西是更好的选择。 – chepner

+0

Bash不支持多维数组(哈希被视为'关联数组')。 – blackghost

回答

0

如果你正在使用bash的足够新的版本,你可以用函数模拟这种情况的(IMO)干净的方式:

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

例子:

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