- A+
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