【原创】本博文为原创博文,引用或转发请注明原始出处和链接: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根本就没定义这两个键,因此遍历时输出两个空行)

bash shell关联数组总结的更多相关文章

  1. 我们一起来学Shell - shell的数组

    文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...

  2. bash脚本中的普通数组和关联数组

    1. 普通数组 bash支持一维数组(不支持多维数组),并且没有限定数组的大小.类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0. ...

  3. [ SHELL编程 ] 数组、关联数组和awk数组

    本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...

  4. SHELL脚本编程-普通数组(列表)和关联数组(字典)

    SHELL脚本编程-普通数组(列表)和关联数组(字典) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组相关概述 变量: 存储单个元素的内存空间 数组: 存储多个元素的连续的 ...

  5. shell练习--关于关联数组自增统计判断的学习

    今天在书上看到了一个关联数组 let statarray["$ftype"]++  这样一个操作,用来做索引的自增统计,所以记下来 #!/bin/bash #统计文件类型 #关于关 ...

  6. bash shell数组使用总结

    本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html  数组的概念就不多说了,大家都懂! shell数组分为索引数组和关联数 ...

  7. shell 之awk 关联数组高级应用

    最近由于数据迁移过,有些用户信息需要再次确认下,也许数据量比较大,但是需要最终确认的比如说是用户ID和其对应的用户积分数,这样就会导致出现文本a(老的数据),文本b(新的数据).比如 这是文本a.tx ...

  8. shell之数组和关联数组

    数组和关联数组 #!/bin/bash #定义数组1 array_var1=(1 2 3 4 5 6)# #定义数组2 array_var[0]="test1" array_var ...

  9. 使用bash关联数组统计单词

    使用bash关联数组统计单词 从bash 4开始支持关联数组,使用前需要声明,即 declare -A map map[key1]=value1 map[key2]=value2 map=([key1 ...

随机推荐

  1. gnuplot图例legend设置

    //将图例放在右下角 set key bottom //将图例放在中间 set key center //将图例放在左边 set key left //将图例放在指定位置右下角的坐标为(10,0.7) ...

  2. tp5使用PHPWord(下载引入/composer两种方式)

    PHPWORD使用文档 一:引入 tp5.0,tp5.1: 1:composer方式(推荐) a:根目录下执行:composer require phpoffice/phpword b:引入: use ...

  3. [水题日常]Luogu1113 杂务

    这几天又在颓. 我的blog难度目前还比较低,主要面向像我这样子的新手(当然内容也会尽量讲得具体清楚一些)x 如果有错误还请指出~ 写完随笔之后才去翻了一下这题题解之后才注意到这题是有序的 QAQ完全 ...

  4. Django之DRF-- API限速

    什么场景下需要限制访问频次呢? 1)防爬虫:爬虫可能会在短时间内大量的访问服务接口,增加服务器压力 2)对于需要限制访问频次的接口 具体使用配置如下: 1,settings.py加入配置 REST_F ...

  5. 用Python实现童年的回忆:俄罗斯方块!别说还挺好玩

    在那个电子产品比较匮乏的年代,小游戏机

  6. 学习JUC源码(3)——Condition等待队列(源码分析结合图文理解)

    前言 在Java多线程中的wait/notify通信模式结尾就已经介绍过,Java线程之间有两种种等待/通知模式,在那篇博文中是利用Object监视器的方法(wait(),notify().notif ...

  7. jq再次封装自己的ajax & js 回调函数 & js方法注释&js 全局屏蔽点击事件及a标签

    1.封装成一个独立JS var commonUrl = 'http://xx.xxx.com/'; function http({ url, type = "post", data ...

  8. 基于nginx负载均衡及frp的内网穿透实例3-多用户多网站共用80端口

    原文地址:点击跳转 最近frp用户量有点多,而且很多用户都是想把部署于本地或者内网的web服务暴露至公网,之前提到过,暴露到公网之后如果一般都需要用域名:端口的方法来访问,但是没有人会喜欢用这种方式访 ...

  9. MethodHandleVS反射

    Method Handle与反射 如无特殊说明,本文所有代码均基于JDK1.8.0_221 Method Handle入门 反射我们都知道,为我们提供了运行时对类的成员方法访问的手段,极大地提高了Ja ...

  10. 发送微信通知 java 实现

    /实现类 @Service public class WeChatServiceImpl implements IWeChatService { @Override public WeChatSend ...