(034) Linux之数组

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

  在上一节中,我们了解了shell如何操作字符串和数字。到目前为止,我们所接触到的数据类型在计算机科学领域被称为标量变量,也就是说,该变量包含一个单一的值。

  在本章中,我们将会学习一种包含多个值的数据结构——数组。事实上,数组几乎是所有程序设计语言的一大特点。尽管shell对数组的支持有限,但它对解决程序设计问题是非常有帮助的。

 

二、什么是数组

  数组是可以一次存放多个值的变量,数组的组织形式如同表格一样。下面以电子表格为例。一个电子表格就像一个二维数组一样。它是由行和列组成的,根据行和列的地址可以在电子表格里标识每一个独立单元的位置。数组也是以这种方式工作的。数组中的单元叫做元素,并且每个元素中含有数据。使用一种叫做索引或是下标的地址就可以访问一个独立的数组元素。

  大多数的程序设计语言支持多维数组。电子表格就是多维数组的一个实例,该数组是由宽度和高度两个维度组成的二维数组。尽管最经常使用的是二维和三维数组,但是很多语言支持任意维数的数组。

  bash中的数组是一维的。可以将它想象成只有一列的电子表格。尽管有这个限制,但是它们还是有很多的用处。

 

三、创建一个数组

  命名数组变量同命名其他bash变量一样,当访问数组变量时可以自动创建它们。实例如下:

  这里我们看到的是赋值和访问数组元素的例子。特别要注意的是在第二条命令中使用花括号是为了阻止shell在数组元素名里试图扩展路径名。

  同时,使用declare命令也可以创建数组,如下所示:

declare -a a

  这是使用选项-a和declare创建数组a的实例。

 

四、数组赋值

  赋值的方式可以有两种。使用下面的语法可以赋单一值。

name[subscript]=value

  这里的name是数组名,并且subscript是大于或等于0的整数(或算术表达式)。要注意的是,数组的第一个元素是0,而不是1。value是赋给数组元素的字符串或是整数。

  使用下面的语法可以赋多个值。

name=(value1 value2...)

  这里的name是数组名,并且将value1 value2...等值依次赋予从元素0开始的数组元素。例如,如果想要将一星期中天数的缩写赋给数组days,那么我们可以像下面这样赋值。

days=(Mon Tue Wed Thu Fri Sat Sun)

  也可以通过为每个值指定一个下标来给指定元素赋值也是可行的。

days=([0]=Mon [1]=Tue [2]=Wed [3]=Thu [4]=Fri [5]=Sat [6]=Sun)

 

五、数组操作

  有很多常见的数组操作。比如删除数组、确定数组大小和排序等在脚本中有很多应用。

 

1. 输出数组的所有内容

  我们可以使用下标“*”和“@”来访问数组中的每个元素。对于定位参数来讲,符号“@”较之更有用。例证如下:

  

  我们创建了数组animals,并使用3个双单词字符串为其赋值,然后执行4个循环以便观察单词拆分对数组内容的影响。如果对符号${animals[*]}和${animals[@]}加以引用,就会得到不同的结果。符号“*”将数组所有内容放在一个字中,而符号“@”将数组所有内容使用3个字来显示数组的真实内容。

 

2. 确定数组元素的数目

  使用参数扩展,我们可以采用类似获取字符串长度的方式来确定数组中元素的个数。实例如下:

  我们首先创建了数组a,并且将字符串foo赋给了第100个元素。接下来,我们使用符号“@”通过参数扩展来确定数组长度。最后,我们查看包含字符串foo的元素100的长度。值得一提的是,当将字符串赋值元素a[100]时,bash报告数组中只有一个元素。这与其他一些编程语言的行为是不同的。在这些语言中,数组中未使用的元素(元素0~99)初始化为空值并参与计数。

 

3. 查找数组中使用的下标

  由于bash允许在下标赋值中包含“空格”,有时这对确定实际存在的元素是很有用的。这可以通过参数扩展来实现,其形式如下:

${!array[*]}
${!array[@]}

  这里的array是数组变量名。就像符号“*”和“@”等参数扩展一样,引用中含有的“@”形式是最有用的,因为它将数组内容扩展成独立的单词。如下图所示:

 

4. 在数组的结尾增加元素

  如果在数组的结尾需要添加元素的话,知道数组中元素的数目是没有用的,因为符号“*”和“@”返回的值并不会告诉我们使用的最大数组索引是什么。幸运地是,shell提供了一种解决办法。通过使用“+=”赋值运算符,可以在数组的尾部自动地添加元素。这里,我们将三个值赋给数组foo,然后再添加3个元素。具体如下图所示:

 

5. 数组排序操作

  就像电子表格一样,通常需要将数据列中的值进行排序。shell虽然没有直接的方式来完成排序功能,但是用一些代码来完成也并非难事。执行结果如下图:

  脚本巧妙地使用一个替换命令将原数组(a)的内容复制到数组(a_sorted)中。通过改变设计流程,我们可以这个基本的技术就可被用来执行数组中的多种操作。

 

6. 数组的删除

  使用unset命令,我们可以删除数组,如下所示:

  

  我们也可以使用unset来删除单个数组元素。

  在这个例子里面,我们删除了数组的第三个元素(下标为2)。记住,数组是以下标0开始的,而不是1开始的!同时需要注意的是,我们必须引用数组元素来阻止shell执行路径名扩展。

  另外需要注意的是,对数组元素赋一个空值并不意味着清空它的内容,如下所示:

  任何涉及到不含下标的数组变量的引用都是指的是数组中下标为0的元素。因此就有了上面的执行结果。

 

posted @ 2015-03-23 22:41  jplatformx  阅读(227)  评论(0编辑  收藏  举报