数组变量

环境变量有一个很酷的特性就是,它们可作为数组使用。数组是能够存储多个值的变量。这 些值可以单独引用,也可以作为整个数组来引用。

要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。

1
2
$ mytest=(one two three four five) 
$

没什么特别的地方。如果你想把数组像普通的环境变量那样显示,你会失望的。

$ echo $mytest 
one
$

只有数组的第一个值显示出来了。要引用一个单独的数组元素,就必须用代表它在数组中位置的数值索引值。索引值要用方括号括起来。

$ echo ${mytest[2]} 
three
$

环境变量数组的索引值都是从零开始。

要显示整个数组变量,可用星号作为通配符放在索引值的位置。

$ echo ${mytest[*]}
one two three four five 
$

打印数组长度(即数组中元素的个数):

$ echo ${#array_var[*]}
6

也可以改变某个索引值位置的值。

$ mytest[2]=seven
$	
$ echo ${mytest[*]}
one two seven four five 
$

甚至能用unset命令删除数组中的某个值,但是要小心,这可能会有点复杂。看下面的例子。

$ unset mytest[2]
$
$ echo ${mytest[*]} 
one two four five
$
$ echo ${mytest[2]}
$ echo ${mytest[3]} 
four
$

这个例子用unset命令删除在索引值为2的位置上的值。显示整个数组时,看起来像是索引 里面已经没这个索引了。但当专门显示索引值为2的位置上的值时,就能看到这个位置是空的。 最后,可以在unset命令后跟上数组名来删除整个数组。

$ unset mytest
$
$ echo ${mytest[*]}
$

有时数组变量会让事情很麻烦,所以在shell脚本编程时并不常用。对其他shell而言,数组变 量的可移植性并不好,如果需要在不同的shell环境下从事大量的脚本编写工作,这会带来很多不 便。有些bash系统环境变量使用了数组(比如BASH_VERSINFO),但总体上不会太频繁用到。

关联数组

gawk编程语言使用关联数组提供数组功能。

关联数组跟数字数组不同之处在于它的索引值可以是任意文本字符串。你不需要用连续的数 字来标识数组中的数据元素。相反,关联数组用各种字符串来引用值。每个索引字符串都必须能够唯一地标识出赋给它的数据元素。如果你熟悉其他编程语言的话,就知道这跟散列表和字典是同一个概念。

定义数组变量

可以用标准赋值语句来定义数组变量。数组变量赋值的格式如下:

var[index] = element

其中var是变量名,index是关联数组的索引值,element是数据元素值。下面是一些gawk 中数组变量的例子。

capital["Illinois"] = "Springfield"
capital["Indiana"] = "Indianapolis"
capital["Ohio"] = "Columbus"

在引用数组变量时,必须包含索引值来提取相应的数据元素值。

遍历数组变量

关联数组变量的问题在于你可能无法知晓索引值是什么。跟使用连续数字作为索引值的数字 数组不同,关联数组的索引可以是任何东西。

如果要在gawk中遍历一个关联数组,可以用for语句的一种特殊形式。

for (var in array) 
{
	statements
}

这个for语句会在每次循环时将关联数组array的下一个索引值赋给变量var,然后执行一 遍statements。重要的是记住这个变量中存储的是索引值而不是数组元素值。可以将这个变量 用作数组的索引,轻松地取出数据元素值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ gawk 'BEGIN{
> var["a"] = 1
> var["g"] = 2
> var["m"] = 3
> var["u"] = 4
> for (test in var) >{
> print "Index:",test," - Value:",var[test] >}
> }'
Index: u - Value: 4
Index: m  - Value: 3
Index: a  - Value: 1
Index: g  - Value: 2
$

注意,索引值不会按任何特定顺序返回,但它们都能够指向对应的数据元素值。明白这点很 重要,因为你不能指望着返回的值都是有固定的顺序,只能保证索引值和数据值是对应的。

删除数组变量

从关联数组中删除数组索引要用一个特殊的命令。

delete array[index] 

删除命令会从数组中删除关联索引值和相关的数据元素值。一旦从关联数组中删除了索引值,你就没法再用它来提取元素值。