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根本就没定义这两个键,因此遍历时输出两个空行)

        

        

  • 相关阅读:
    nyoj592 spiral grid
    ny788 又见Alice and Bob
    hdoj 1166 敌兵布阵 线段数和树状数组
    nyoj228 士兵杀敌(5)插线问线
    nyoj576 集齐卡片赢大奖(一)
    ny269 VF
    AC Again hdoj 1582 搜索
    nyoj123 士兵杀敌(四)树状数组 插线问点
    CRAVAT: Cancer-Related Analysis of VAriants Toolkit
    第二代无创胎儿基因组分析结果
  • 原文地址:https://www.cnblogs.com/dingbj/p/dict_array.html
Copyright © 2011-2022 走看看