分类: LINUX
2008-12-17 16:04:02
bash只提供一维数组,并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标。下标可以是整数或算术表达式,其值应大于或等于0。用户可以使用赋值语句对数组变量赋值。对数组元素赋值的一般形式是:
数组名[下标]=值
例如:
|
也可以用declare命令显式声明一个数组,一般形式是:
|
读取数组元素值的一般格式是:
|
例如:
|
一个数组的各个元素可以利用上述方式一个元素一个元素地赋值,也可以组合赋值。定义一个数组并为其赋初值的一般形式是:
|
其中,各个值之间以空格分开。
例如:
|
由于值表中初值共有7个,所以A的元素个数也是7。A[8]超出了已赋值的数组A的范围,就认为它是一个新元素,由于预先没有赋值,所以它的值是空串。
若没有给出数组元素的下标,则数组名表示下标为0的数组元素,如city就等价于city[0]。
使用*或@做下标,则会以数组中所有元素取代[*]或[@]。
除了上面所介绍的变量引用方式外,在bash中还有其它的引用方式。归纳起来,有效的变量引用表达式有以下形式:
|
(1)表达式$name表示变量name的值,若变量未定义,则用空值替换。
(2)表达式${name}将被变量name的值替换。用花括号括起name,目的在于把变量名与后面的字符分隔开,避免出现混淆。替换后花括号被取消。
(3)${name[n]}表示数组变量name中第n个元素的值。
(4)表达式${name[*]}和${name[@]}都表示数组name中所有 非空元素的值,每个元素的值用空格分开。如果用双引号把它们都括起来,那么二者的含义就有区别:对于"${name[*]}",它被扩展成一个词(即字符 串),这个词由以空格分开的各个数组元素组成;对于"${name[@]}",它被扩展成多个词,每个数组元素是一个词。如果数组name中没有元素, 则${name[@]}被扩展为空串。
(5)表达式${name:-word}、${name:=word}、${name:+word}、${name:?word}的计算方法在下面介绍。
(6)表达式${name#pattern}和${name##pattern}, 如果pattern(表示匹配模式)与name值的开头匹配,那么name的值去掉匹配部分后的结果就是该表达式的值;否则, name的值就是该表达式的值。在第一种格式中,name值去掉的部分是与pattern匹配的最少的部分;而第二种格式中,name值去掉的部分是与 pattern匹配的最多的部分。
(7)表达式${name % pattern}和${name %% pattern},如果pattern与name值的末尾匹配,那么name的值中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是 name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。
(8)表达式${#@}和${#*}的值分别是由$@和$*返回的参数的个数。
(9)表达式${#name[i]}的值是数组name第i个元素值的长度(字符个数)。
(10)表达式${#nane[*]}和${#name[@]}的值都是数组name中已经设置的元素的个数。