首页 > 系统相关 >Linux_Bash_Shell_索引数组和关联数组及稀疏数组

Linux_Bash_Shell_索引数组和关联数组及稀疏数组

时间:2022-10-09 10:55:07浏览次数:80  
标签:Shell 下标 元素 索引 数组 Linux Bash 备注

 

1. 索引数组

 

一、什么是索引数组?

所谓索引数组就是普通数组,以整数作为数组元素的索引下标。

 

 

 

二、实例。

 

 

备注:

(a)使用-a选项定义索引数组,使用一对小括号()定义数组中的元素列表。

(b)索引数组使用整数作为数组元素下标。

 

 

备注:

(a)使用@和*作为数组下标,表示获取所有元素。

 

三、实例。

 

备注:

(a)${#a[@]}和${#a[*]}都表示计算数组长度,也就是元素的数量。

 

四、实例。

 

备注:

(a)直接使用数组下标索引来修改数组中指定的元素。

 

五、实例。

 

 

 

 

备注:

(a)数组使用感叹号获取数组中所有已存在的元素的索引下标。

 

 

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程_V1.0.zip

2. 关联数组

一、什么是关联数组?

所谓关联素组指的是使用普通字符串作为数组下标,每一个元素形成一个键值对,也就是key-value。

 

二、实例。

 

 

备注:

(a)使用大写的-A选项配合小括号()定义关联数组。

(b)这个例子中使用字符串a作为键值对的key,Butianyun作为键值对的value,以此类推。

(c)关联数组也可以正常使用感叹号获取所有的索引下标,正常使用#这个符号获取数组的长度。

 

 

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程_V1.0.zip

3. 稀疏数组

 

一、什么是稀疏数组?

所谓稀疏数组是指整数作为数组索引下标时,所有的索引下标按照从小到大排序之后在数值上并不连续的数组,因为有一些索引下标对应的元素并不存在。

 

二、实例。

 

 

 

备注:

(a)这个例子中先定义了一个空的索引数组,然后直接对某一些索引序号对应的元素赋值,自然而然的创建了一个稀疏数组。

(b)索引数组中元素的排列次序是按照索引下标的整数从小到大排序的。

 

三、实例。

 

 

 

备注:

(a)索引数组也是支持直接在小括号内使用中括号指定每一个元素的索引下标。

 

 

四、实例。

 

 

 

备注:

(a)思考:

问题:这个数组a是索引数组还是关联数组?

答案:索引数组。原因:使用-a选项只能定义索引数组。

(b)如果在后面指定的索引下标跟前面的重复了,那么后面的索引下标对应的元素会覆盖掉前面的元素。效果上相当于前面的元素没有出现一样。

 

 

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程_V1.0.zip

 

4. 关联数组的元素排列次序

一、实例。

 

 

 

备注:

(a)思考:

问题:这个数组a是稀疏数组吗?

答案:不是。原因:使用大写的-A选项定义的是关联数组。

 

(b)如果使用关联数组,可以看到运行结果与索引数组完全不同。

(c)关联数组中的元素的排列既没有按照索引下标排序,不是按整数排序,也不是按字符串排序;也不是按照定义数组时元素出现的次序排序。排列次序看起来似乎是杂乱无章的。

 

 

二、实例。

 

 

 

 

备注:

(a)可以看到既不是按照键值对的key排序,也没有按照键值对的value排序。

(b)思考:

问题:为什么关联数组的元素排列出现这种看起来杂乱无章的排列次序?

答案:关联数组内部使用哈希技术。根据哈希的特性,key的次序无法决定key的哈希值的次序。

 

三、实例。

 

 

 

备注:

(a)对于这种只有一个字母作为key的关联数组,元素的排列次序看起来好像是有规律的,实际上却是是有规律的。

(b)下面使用随机化产生的关联数组来解释这种规律。

butianyun.sh脚本文件:

 

 

 

备注:

(a)总结:对于这种索引下标只有一个字母或数字的关联数组,元素排列次序有规律:

规律1:字母作为索引的,按照索引下标的ASCII码次序从大到小排列,也就是正常ASCII码次序的逆序排列。

规律2:数字作为索引的,按照索引下标的ASCII次序从大到小排列。

规律3:数字作为索引的元素排在字母作为索引的元素的前面。

(b)对于这种情况,元素排列次序并不能说成是按照ASCII次序从大到小排列,而是先把数字和字母分成了两大类。

 

 

备注:

(a)如果key不是一个字符,而是两个字符或更多字符,则没有这种规律了。

(b)下面这个例子更好的证明了这一点。

butianyun.sh脚本文件:

 

 

 

 

 

备注:

(a)随机化产生的关联数组,索引下标是两个字母或数字,这时元素的排列次序就没有规律,而是取决于key的哈希值。

 

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程_V1.0.zip

 

5. @和*的异同点

一、实例。

 

 

 

备注:

(a)数组a总共有三个元素,第二个元素包含一个空格。

(b)在这个例子中,使用@和 *并没有什么区别。

(c)不管使用@还是*,数组a的长度都是3。

 

 

 

 

备注:

(a)在这个例子中,使用@和*也没有什么区别。

(b)思考:

问题:为什么在把数组a的元素全部放置到数组b和c中之后,b和c的数组长度都是4呢?

答案:代码中对b和c的赋值,等效于如下代码。

 

 

 

备注:

(a)bash shell对命令行的参数的解析过程中,有一个去掉双引号的过程,相当于这些字符串都没有加双引号。所以就会被认为有四个元素。

 

二、实例。

 

 

 

 

备注:

(a)在对数组b和c赋值时,小括号()中加了双引号,使用@和*的效果就有了很大的区别。

(b)思考:

问题:为什么使用@之后数组b有3个元素,而使用*之后数组c只有1个元素?

答案:这跟bash shell对”${a[@]}”和”${a[*]}”的规定有关。

 

在bash shell中,把”${a[@]}”展开之后相当于将数组a的每一个元素加上双引号之后形成一个列表。

 

 

 

备注:

(a)这个例子解释了为什么数组b有三个元素。”Linux Bash”这个字符串在a中作为一个元素,在b中还是作为一个元素看待。

在bash shell中,把”${a[*]}”展开之后相当于将数组a的每一个元素形成一个列表之后再整体上加双引号,这样自然就只有一个元素了。

 

 

 

备注:

(a)这个例子解释了为什么数组c只有一个元素。”Butianyun Linux Bash Shell”这个字符串整体在c中作为一个元素看待。

 

 

三、实例。

理解@和*的区别有什么价值呢?下面讨论在for循环中的应用。

 

 

 

 

备注:

(a)数组a本身只有三个元素。第二个元素包含空格。

(b)在不加双引号时,不管使用@还是*,循环体都是执行四次。

(c)数组a的第二个元素”Linux Bash”被拆分成两个独立的词语。

 

 

 

 

备注:

(a)在使用@并且加了双引号之后,循环体只执行了三次。数组a的第二个元素并没有被拆分。

加双引号之后,相当于数组a的每一个元素加上双引号之后形成了一个列表。

 

 

 

 

备注:

(a)在使用*并且加了双引号之后,循环体只执行了一次。数组a的所有元素形成一个列表之后再加双引号,相当于数组a的所有元素合并成了一个整体。

 

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程_V1.0.zip

 

 

 

标签:Shell,下标,元素,索引,数组,Linux,Bash,备注
From: https://www.cnblogs.com/mtyxb/p/16771367.html

相关文章

  • 官方下载xshell xftp
    免费下载xshell页面    https://www.xshell.com/zh/free-for-home-school/ ......
  • 在java 的基础上增量学习 shell 编程
     shell 脚本其实还是我们比较常用的,在开发中经常会有需求,要写脚本实现某某功能。 比如,别人让写一个告警脚本,将消息推送到钉钉上。 这篇文章作为shell 的入门吧。 jav......
  • 【博学谷学习记录】超强总结,用心分享|Java基础分享-数据结构(数组、链表)
    目录1.数组2.链表2.1.链表简介2.2.链表分类2.2.1.单链表2.2.2.循环链表2.2.3.双向链表2.2.4.双向循环链表1.数组数组(Array) 是一种很常见的数据结构。......
  • abc272_f Two Strings (后缀数组)
    https://atcoder.jp/contests/abc272/tasks/abc272_f将SS#TT在字符串中排序,看标号为1-n后面有多少2n+2-3n+1的标号然后就会注意题目要的是小于等于,那么要拼成SS......
  • 查找数组中元素
    对于任意一个数组,不知道是无序还是有序,查找是否有元素,那比较保险的方法就是遍历。伪代码对于任何一个数组:Write"Pleaseinputthesum"ReadnIntegernumber[n]Wr......
  • Linux 服务器搭建与宝塔面板使用
    一:Linux服务器搭建软件:VM16.x、centos79.5G参考搭建:https://blog.csdn.net/qq_37449606/article/details/125089544注:1、 ifcfg-en33文件中的ip地址与网关,可以从VM......
  • 关于Centos6、selinux和ansible
    简单说,一般来说,ansible想通过证书访问其他主机,需要关闭selinux。或者(也可能是并且),安装libselinux-python。而centos6已经停止维护了,需要更新yum源,或者挂载系统安装包。否......
  • linux第一章文件命令
    Linux文件系统组成  /bin:存放二进制可执行命令目录(ls,cat,mkdir等)/home:用户主目录的基点目录,默认情况每个用户主目录都设在该目录下如默认情况下用户......
  • 深入Linux内核架构 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1s1vZTJ5SQwZIbOOJTeTNMg点击这里获取提取码 ......
  • LeetCode算法笔记 53. 最大子数组和
    给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2......