加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:33:02 所属栏目:安全 来源:网络整理
导读:我想在 shell中创建地图.每个值都是一个数组.所以地图是关键:数组对.例如,它可以是这样的: "Key1" : a1 a2 a3 a4"key2" : b1 b2 b3"key3" : c1 基本上我的代码看起来像这样 listService(){serviceType=$1servicesList=($(getServices $serviceType))}listS
我想在 shell中创建地图.每个值都是一个数组.所以地图是关键:数组对.例如,它可以是这样的:
"Key1" : a1 a2 a3 a4
"key2" : b1 b2 b3
"key3" : c1

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

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

listService serviceTypeA
listService serviceTypeB
listService serviceTypeC

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

"serviceA" : a1 a2 a3 a4
"serviceB" : b1 b2 b3
"serviceC" : c1

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

在此先感谢您的帮助.

编辑:我尝试了@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 $paramn"
  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

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

valuesList= ${arrayMap[$param]}

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

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

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

得到:

"serviceTypeC": C1 C2 C3 C4
"serviceTypeB": B1 B2 B3 B4
"serviceTypeA": A1 A2 A3 A4

编辑新问题:

改变:

arrayMap["$param"]=$values     # THIS IS THE KEY LINE
valuesList=${arrayMap[$param]}

至:

arrayMap["$param"]=${values[@]} 
valuesList=( ${arrayMap[$param]}  )

当你通过它的名字($values)引用数组变量时,你只得到第一个元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读