无论是高级语言,还是低级脚本语言,都离不开数组概念。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中的数组定义和使用。