码迷,mamicode.com
首页 > 编程语言 > 详细

bash数组和关联数组

时间:2015-05-13 19:59:24      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:linux 数组

1.1.1 数组

数组就是变量阵列,多个变量组合到一块,通过同一个名字进行存取操作。数值是连续的多个独立的内存空间(元素),每个内存空间相当于一个变量。数组元素通过“数组名[索引]”进行引用。索引也称为下标,从0而不是1开始编号。

声明数组:declare -a Array_Name

bash的数组支持稀疏格式,所谓的稀疏格式就是,一个数组中的只有两个元素,但这两个元素可以是第一个和第九个,中间的都为空。

 

1.1.1.1 数组元素赋值

(1) 一次只赋值一个元素

a_name[index]=value --> 数组名[索引]=值

 

例如:

weekday[0]="Sunday":数组weekday第1个元素为Sunday

weekday[1]="Monday":

 

(2) 一次赋值全部元素

weekday=("Sunday" "Monday" "Tuesday")

[root tmp]# weekdays=(Sun Mon Tue Wed)
[root tmp]# echo ${weekdays[0]}
Sun
[root tmp]# echo ${weekdays[1]}
Mon

(3) 指定索引进行赋值,支持稀疏格式

weekdays=([0]="Sunday" [3]="Thu" [6]="Sat")

[root tmp]# weekdays=([6]=Sun [0]=Mon [1]=Tue)
[root tmp]# echo ${weekdays[2]}
 
[root tmp]# echo ${weekdays[1]}
Tue
[root tmp]# echo ${weekdays[6]}
Sun

(4) read -a a_name,实现多个数据到数组中。

不使用-a会当成一个元素

[root tmp]# read hello
qw er t
[root tmp]# echo ${hello[1]}
 
[root tmp]# echo ${hello[0]}
qw er t

使用-a就会通过空格区分

[root tmp]# read -a hello
qw er t
[root tmp]# echo ${hello[1]}
er
[root tmp]# echo ${hello[0]}
qw

1.1.1.2 引用数组元素

${array_name[index]},花括号是不可省略的。

获取数组长度(就是获取数组中有多少元素):${#array[*]}, ${#array[@]}

[root tmp]# echo ${#hello[*]}
3

不带下标时,默认为第一个元素:

[root tmp]# echo $hello
qw

因此,此为显示第一个元素中的字符个数:

[root tmp]# echo ${#hello}
2


练习:写一个脚本,生成10个随机数,保存至数据组中,而后显示数组索引为偶数的元素的值。

#!/bin/bash
#
for ((i=0;i<10;i++)); do
rand[$i]=$RANDOM
echo ${rand[$i]}
done
 
echo "========================"
 
for i in `seq 0 2 9`; do
echo ${rand[$i]}
done

练习:写一个脚本,定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字,显示每个文件的行数。

#!/bin/bash
#
declare -a files
 
files=(/var/log/*.log)
 
for i in `seq 0 $[${#files[*]}-1]`; do
wc -l ${files[$i]}
done

1.1.1.3 数组切片

从数组中挑选指定的某个或某些元素:${array[@]:offset:number}

offset:偏移的元素的个数。

number:要取出的元素的个数。

[root ~]# weekdays=(Sun Mon Tue Wed Thu Fri Sat)
[root ~]# echo ${weekdays[@]:2:2}
Tue Wed
[root ~]# echo ${weekdays[@]:3:2}
Wed Thu


取出偏移量之后剩余所有的元素:${array[@]:offset}

[root ~]# echo ${weekdays[@]:3}
Wed Thu Fri Sat

所有元素:${array[@]}

 

1.1.1.4 数组添加元素

array_name[${#array_name[*]}]=value 

 

稀疏格式这么添加可能会造成覆盖:

[root ~]# hello=([6]=qw [3]=er [4]=ty)
[root ~]# echo ${hello[@]}
er ty qw
[root ~]# hello[${#hello[*]}]=ui
[root ~]# echo ${hello[@]}
ui ty qw

非稀疏格式完全没问题:

[root ~]# hello=(qw er ty ui)
[root ~]# hello[${#hello[*]}]=nm
[root ~]# echo ${hello[@]}
qw er ty ui nm

1.1.1.5 从数组中删除元素

unset array[index],撤销不是引用,一定不要加$。

[root ~]# weekdays=(Sun Mon Tue Wed Thu Fri Sat)
[root ~]# unset weekdays[3]
[root ~]# echo ${weekdays[@]}
Sun Mon Tue Thu Fri Sat

1.1.2 关联数组

bash从4.0版本起支持关联数组,数组索引可为自定的字符串。也就是说数组的下标可以不再是数字了。

 

定义方法:declare -A array_name

[root ~]# declare -A wdays
[root ~]# wdays=([sun]=Sunday [mon]=Monday [tue]=Tuesday)
[root ~]# echo ${wdays[mon]}
Monday

有了数组之后就可以定义比较复杂的算法了。

 

bash数组和关联数组

标签:linux 数组

原文地址:http://10042224.blog.51cto.com/10032224/1651033

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!