无论是高级语言,还是低级脚本语言,都离不开数组概念。Shell脚本中也同样有数组,所谓数组:“即能够存储多个值的变量”。这些值可以单独引用,也可以作为整个数组使用。数组大小没有最大限制,也没有要求连续索引或分配成员变量。
定义一个数组的语法如下:
array_name=(value1 value2 value3 value4 value5 ...)
首先是一个数组名,其命名规则遵循【001】变量知多少 中第2节所描述的。然后紧接着是一个等号(=),注意这里数组名和等号之间同样不能有空格符号,然后是一对括号,括号里面是数组的值,可以有若干个,各value之间以空格符号分隔。
如下示例,定义了一个array数组变量,其值为“1、2、3、4、5、6、7”。通过echo将其数组变量一一打印出来。
#!/bin/sh
array=(1 2 3 4 5 6 7)
echo "${array[*]}"

上面的数组,其元素是数值;若元素是字符串,则需要对每个元素使用双引号括起来,如下:
#!/bin/sh
country=("This" "is" "China." "This" "is" "my" "country")
echo ${country[*]}
打印结果如下图所示:

Shell脚步中的数组,其元素值可以除了可以是统一数值、字符串外,还可以是这两个的混合。
比如下面的other数组,其元素值列表由字符串,也有数值。我们只需要对字符串的值使用双引号括起来。
other=("hello" 123)
echo ${other[*]}
打印结果:

引用数组元素分为多种情形,比如引用指定的某个元素,引用数组变量中的所有元素等,下面将一一介绍这些情形。
如果想通过
${array_name}方式来输出数组变量array_name中的所有元素,是不生效的。它只会输出array_name中的第一个元素。
如下图:

Shell脚步中的数组同样支持引用指定下标元素的功能,且数组下标是从0开始(这一点和C/C++中的数组下标从0开始相同)。比如上面的array数组变量,要引用数组元素3,则对应array数组变量中的下标为2。我们可以这样进行引用:
echo "${array[2]}"
其打印结果如下图所示:

以此类推,引入数组元素6,则对应的下标是5,即:${array[5]}。
若引用的数组索引下标超过数组的范围,结果会怎样?参考下面的示例代码,第一个索引下标7已经超出了数组array的范围,后面的array[10]更不用说,其结果会怎样,我们执行看下现象。
#!/bin/sh
array=(1 2 3 4 5 6 7)
echo $array[7]
echo $array[10]
echo $array[100]
echo $array[1000]
echo $array[10000]
echo $array[100000]
可以看到,Shell脚步中索引超出数组范围不会导致Shell脚步core掉,但是得到的结果是不正确的,如下图所示:

因此,在使用数组的时候,一定要数组,不要让索引下标越界。
我们可以通过索引下标的方式,对Shell脚步中数组的指定元素的值进行修改。如下所示:
#!/bin/sh
country=("This" "is" "China." "This" "is" "my" "country")
echo ${country[*]}
country[5]="our"
echo ${country[*]}
修改country数组中下标为5(也就是数组元素“my”)的元素为“our”,然后重新打印该数组:

Shell脚步同样支持类似C/C++中的for、while等循环语句,因此,可以借助这些语句循环遍历打印数组中的所有元素,由于这里还没有介绍for、while。所以本节内容在后面介绍循环语句时候会重点进行讲解。
我们可以在不使用循环语句(如
for、while等)情况下,同样输出数组的所有元素,那就是通过下标的方式,搭配通配符(*),来达到效果。如:
${array_name[*]}#这里的索引不使用具体值,而是使用一个通配符号(*)。
在【001】变量知多少的2.6节中有介绍过使用unset命令来删除变量,同样可以使用该命令来删除数组指定索引下标的元素,或数组中的所有元素。
要删除数组中指定索引下标对应的元素,其语法是:unset array_name[index]。即unset后面直接是数组名和指定索引下标。

要删除数组变量中的所有元素,则需借助通配符(*)完成,其格式是:unset array_name[*]。

本节详细介绍了Shell脚步中数组的功能,从如何定义数组,到引用数组元素,到删除数组元素等等。通过本文的学习,能够完全掌握Shell中的数组定义和使用。