shell中的数组

来源:互联网 时间:1970-01-01

shell中的数组


shell作为一门语言那肯定是不能缺少数组了,下面记录了shell中数组的一些相关内容。

Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare 可以显式地定义数组。数组的大小没有上限,也没有限制在连续对成员引用和赋值时有什么要求。数组以整数为下标,从 0 开始。

1. 定义和初始化数组

下面的示例总结了如何定义一个数组和如何来初始化数组:

declare -a array #显示声明了数组arraydelcare -a array[10] #数组大小没有上限,所以定义时指定的大小会被忽略array[key]=value #array[0]=one,array[1]=twoarray=(value1 value2...) #value的形式都是[subscript]=string,下标和等号可以省略,示例如下。array=(value1 value2 value3) #array[0]=value1,array[1]=value2,array[2]=value3array=([0]=value1 [2]=value3 [3]=value[4])

从上面来看数组的定义也是非常灵活多变的,能够满足我们大部分的需求,跟其其它语言最大的区别就是shell中的数组大小没有上限,也可以理解为数组是动态的。

2. 数组的访问

数组的任何元素都可以用${array[subscript]}来引用,花括号是必须的,以避免和路径扩展冲突。
如果 subscript 是@或是*,它扩展为array的所有成员。这两种下标只有在双引号中才不同。在双引号中,${name[*]}扩展为一个词,由所有数组成员的值组成,用特殊变量IFS的第一个字符分隔数组成员;${array[@]}将array的每个成员扩展为一个词。 如果数组没有成员,${name[@]} 扩展为空串。

#!/bin/basharr=(one two)for i in ${arr[*]}do echo ${i}done

上面的示例代码的输出结果如下:

[email protected]:~/station/shell$ sh ./array.sh
one two

#!/bin/basharr=(one two)for i in ${arr[@]}do echo ${i}done

上面的示例代码的输出结果如下:

[email protected]:~/station/shell$ sh ./array.sh
one
two

3. 数组的删除

用unset来进行数组的删除,示例如下:

unset array[2] #删除第三个成员unset array #删除整个数组

4. 数组的长度

${#arr[@]}${#arr[*]}${#arr} #错误的。这个获取的是数组第一个成员的长度。

5. 数组的”切片”操作

获取数组的“子串“用${arr[@]:n:m}来表示,如果没有:m那么就获取从下标n开始到最后一个元素的“字串“,示例如下:

#!/bin/bashecho ${arr[@]:2}echo ${arr[@]:1:3}echo ${arr[@]:0}

输出如下:

three four
two three four
oner two three four

6. 关联数组

shell中还可以声明一个关联数组,普通数组只能使用整数作为数组的索引,而关联数组则使用字符串作为数组的索引。这个关联数组是不是有点其它语言中的字典的意思呢,o(∩∩)o…哈哈

#!/bin/bashdeclare -A ass_arrass_arr[apple]=12ass_arr[orange]=19for t in ${ass_arr[@]}do echo ${t}doneecho ass_arr[orange]=${ass_arr[orange]}

上面的示例输出如下:

19
12
ass_arr[“orange”]=19

从上面的输出来看关联数组输出的顺序跟普通数组有一些不同,关联数组是从最后一个成员开始输出。
关联数组使用字符串作为索引,有时候我们需要获取数组的所有索引,可以用如下的方式来获取:

#!/bin/bashdeclare -A ass_arrass_arr[apple]=12ass_arr[orange]=19echo ${!ass_arr[@]} #or ${!ass_arr[*]}

输出如下:

apple orange

 

相关阅读:
Top