如何创建key的映射:shell中的数组?

sau*_*rav 8 unix arrays bash shell

我想在shell中创建地图.每个值都是一个数组.所以地图是关键:数组对.例如,它可以是这样的:

"Key1" : a1 a2 a3 a4
"key2" : b1 b2 b3
"key3" : c1
Run Code Online (Sandbox Code Playgroud)

基本上我的代码看起来像这样

listService(){
serviceType=$1
servicesList=($(getServices $serviceType))
}

listService serviceTypeA
listService serviceTypeB
listService serviceTypeC
Run Code Online (Sandbox Code Playgroud)

getServices是一个函数,它根据传递的参数返回一个服务数组$serviceType.因此每次我调用该listService函数时,我serviceList都会被新服务列表覆盖.但我希望以不同的服务类型保留所有服务,如下所示:

"serviceA" : a1 a2 a3 a4
"serviceB" : b1 b2 b3
"serviceC" : c1
Run Code Online (Sandbox Code Playgroud)

之后,我想基于密钥访问每个阵列.如何实现这一目标.

在此先感谢您的帮助.

编辑:我尝试了@cdarke提供的答案.这是我现在的代码:

#!/bin/bash
declare -A arrayMap

getValues(){
  key=$1
  case $key in
    AAA )
    arr=( AA AAA AAAA )
      ;;
    BBB )
    arr=( BB BB BBBB )
      ;;
    CCC )
    arr=()
    ;;
    esac
    echo "${arr[@]}"
}

fillArrayMap(){
  param=$1
  values=( $(getValues $param) )
  printf "\nIn $param\n"
  echo -e "\nArray values is: ${values[@]}\n"
  printf "\nLength of the array values is : ${#values[@]}\n"
  arrayMap["$param"]=$values #THIS IS THE KEY LINE
  valuesList=${arrayMap[$param]} 
  echo -e "\nArray valuesList is: ${valuesList[@]}\n"
  printf "\nLength of the array valuesList is : ${#valuesList[@]}\n"
}

fillArrayMap AAA
fillArrayMap BBB
fillArrayMap CCC
Run Code Online (Sandbox Code Playgroud)

现在从输出我可以看到valuesList只获得values数组的第一个元素.但我想valuesList包含该方法返回的所有元素getValues.即

valuesList= ${arrayMap[$param]}
Run Code Online (Sandbox Code Playgroud)

现在valuesList应该包含所有元素,而现在它只包含1个元素.如何解决?

注意:我的目标是访问每个单独的元素,如AAA或AA,我不需要像AA AAA AAAA这样的字符串作为一个整体

cda*_*rke 6

Bash 不支持多维数组,但我认为您不需要。您可以在数组元素中以列表的形式存储字符串,这将满足您的要求。

# My made-up version of getServices
getServices() {
    nm="$1"
    last=${nm##*Type}
    retn=(${last}1 ${last}2 ${last}3 ${last}4)
    echo "${retn[@]}"
}


declare -A serviceList
listService(){
    serviceType="$1"

    # Here I use the key to make an assignment, which adds to the hash
    serviceList["$serviceType"]=$(getServices $serviceType) 
}

listService serviceTypeA
listService serviceTypeB
listService serviceTypeC

for key in ${!serviceList[@]}
do
    echo "\"$key\": ${serviceList[$key]}"
done
Run Code Online (Sandbox Code Playgroud)

给出:

"serviceTypeC": C1 C2 C3 C4
"serviceTypeB": B1 B2 B3 B4
"serviceTypeA": A1 A2 A3 A4
Run Code Online (Sandbox Code Playgroud)

编辑新问题:

改变:

arrayMap["$param"]=$values     # THIS IS THE KEY LINE
valuesList=${arrayMap[$param]} 
Run Code Online (Sandbox Code Playgroud)

到:

arrayMap["$param"]=${values[@]} 
valuesList=( ${arrayMap[$param]}  )  
Run Code Online (Sandbox Code Playgroud)

当您仅通过名称 ( $values)引用数组变量时,您只会获得第一个元素