zoukankan      html  css  js  c++  java
  • bash shell关联数组总结

     【原创】本博文为原创博文,引用或转发请注明原始出处和链接:https://www.cnblogs.com/dingbj/p/dict_array.html 

    什么是关联数组?

    关联数组相对于索引数组,又称字典,这里我就不给具体定义了,可以百度。

    通过对比普通索引数组,能够快速理解运用关联数组。在定义或者引用索引数组时,通常使用数字下标来索引数组中不同的元素,

    而关联数组最大的差别是,元素是无序的,关联数组由特定格式的键值对组成,关联数组的键是唯一的,同时使用键作为下标来索引关联数组元素。当然,对于无变量类型的脚本语言,数字可以被看做特殊的字串,

    也就是说,在关联数组的索引中,你也可以使用数字作为键。

    定义和初始化关联数组

        关联数组初始化赋值方式1

    这种情况必须先声明再初始化,例如:

           declare -A mydict    #声明

          mydict["name"]=guess

          mydict["old"]=18

          mydict["favourite"]=coconut

     关联数组初始化赋值方式2:

    以索引数组格式定义,只不过元素变成了键值对,这种方式不需要先声明,例如:

      mydict=(["name"]=guess ["old"]=18 ["favourite"]=coconut] ["my description"]="I am a student")

        也可以声明并同时赋值: 

      declare -A mydict=(["name"]=guess ["old"]=18 ["favourite"]=coconut ["my description"]="I am a student")

        方式2中,和索引数组定义方式一样,直接在变量赋值语句的等号右侧用小括号定义,但括号内部元素格式不同:

            元素格式为:["键"]=值,元素键值对之间以空格分隔。

      

    关联数组的引用

    引用某个元素时,和普通数组的区别:只是索引为键而已

      例如:echo ${mydict["name"]},输出为guess

    引用整个关联数组时,和普通数组的引用完全一样

      例如:echo ${mydict[@]} 或 echo ${mydict[*]}

    关联数组的操作

    获取关联数组长度(元素的个数):

    例如:echo ${#mydict[@]}

    关联数组切片:

    通常,索引数组时有序的,而关联数组是无序的,虽然关联数组的切片还是能输出,但输出元素的排列顺序在不同的电脑上是不相同的,因此建议不要使用分片操作;

    关联数组元素值的替换:

    echo ${mydict[@]/guess/xiaoli}

    关联数组的删除:

    unset mydict

    获取关联数组索引列表:

    格式:${!关联数组名[@或*]

         

        

    注意,键“my description"在这里看不出是一个字符串整体

     对关联数组元素直接进行运算:

    使用let命令对未定义的元素进行算数计算时,默认值为0,例如:

    let mydict['one']++

     

    遍历关联数组元素:

     (实际上是对键列表进行遍历,在循环中引用这些键)

      同样需要注意的是,${!mydict[@]}和${!mydict[*]}使用双引号括住时的差别:

      有@时,双引号括住能保证元素值有空格的情况下不会出问题,

      而有*时,双引号括住后将解析为所有索引以空格分隔的字符串,如果再把这个字符串作为循环体中操作关联数组的索引,输出肯定为空。

      当不使用引号括住时,只能针  对无空格的元素值才能表现正常,因此,遍历时通常使用有@的格式,并用双引号括住。

        例如:

        

        错误用法举例:

        (有@或*,但没有双引号括住时,

    ${!mydict[*]}输出的是没有引号的键的列表,for解析时将有空格的”my description“键拆分为my和description,

    但mydict根本就没定义这两个键,因此遍历时输出两个空行)

        

        

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/dingbj/p/dict_array.html
Copyright © 2011-2022 走看看