标签:linux 数组
数组就是变量阵列,多个变量组合到一块,通过同一个名字进行存取操作。数值是连续的多个独立的内存空间(元素),每个内存空间相当于一个变量。数组元素通过“数组名[索引]”进行引用。索引也称为下标,从0而不是1开始编号。
声明数组:declare -a Array_Name
bash的数组支持稀疏格式,所谓的稀疏格式就是,一个数组中的只有两个元素,但这两个元素可以是第一个和第九个,中间的都为空。
(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
${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
从数组中挑选指定的某个或某些元素:${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[@]}
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
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
bash从4.0版本起支持关联数组,数组索引可为自定的字符串。也就是说数组的下标可以不再是数字了。
定义方法:declare -A array_name
[root ~]# declare -A wdays [root ~]# wdays=([sun]=Sunday [mon]=Monday [tue]=Tuesday) [root ~]# echo ${wdays[mon]} Monday
有了数组之后就可以定义比较复杂的算法了。
标签:linux 数组
原文地址:http://10042224.blog.51cto.com/10032224/1651033