认识数组:
变量是存储单个元素的内存空间,而数组就是多个变量的合集,是一串连续的空间,但是,整个数组只能有一个名字。
数组内的数据都有指定的索引,以找到数组内指定的数据。索引的编号是从0开始,依次递增(0,1,2,3…),属于数值索引。索引也支持自定义的格式,而不仅是数值格式的索引,即为关联索引,在bash4.0版本之后开始支持。而且,bash的数组支持稀疏格式,即索引不连续(如,0,2,3,5…)。
定义数组:
定义数组,首先需要声明数组,如:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 关联数组
数组元素的赋值:
(1) 一次只赋值一个元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday" weekdays[4]="Thursday"
(2) 一次赋值全部元素:
ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)
weekdays=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" )
(3) 只赋值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)
weekdays=([0]="Sunday" [3]="Wednesday")
(4) 交互式数组值对赋值
read -a ARRAY
[root@localhost ~]# read -a number 1 3 5 7 9 [root@localhost ~]#
引用数组:
格式:引用数组元素:${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下标为0的元素
数组的长度(数组中元素的个数):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
[root@localhost ~]# read -a number 1 3 5 7 9 [root@localhost ~]# echo ${number[1]} 3 [root@localhost ~]# echo ${number[0]} 1 [root@localhost ~]# echo ${number[*]} 1 3 5 7 9 [root@localhost ~]# echo ${#number[*]} 5
示例1:生成10个随机数保存于数组中,并找出其最大值和最小值
[root@localhost shuzu]# vim snum.sh #!/bin/bash declare -a rand declare -i max declare -i min for i in {0..9} ;do rand[$i]=$RANDOM echo ${rand[$i]} if [ $i -eq 0 ] ;then max=${rand[$i]} min=${rand[$i]} else [ "$max" -lt "${rand[$i]}" ] && max=${rand[$i]} [ "$min" -gt "${rand[$i]}" ] && min=${rand[$i]} fi done echo "max number is $max " echo "min number is $min "
示例2:编写脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;要统计其下标为偶数的文件中的行数之和
[root@localhost shuzu]# vim sfilenum.sh #!/bin/bash declare -a files declare -i line=0 files=(/var/log/*.log) for i in `seq 0 $[${#files[*]}-1]` ;do if [ $[$i%2] -eq 0 ] ;then let line+=`wc -l ${files[$i]} | cut -d" " -f1` fi done echo "lines is $line"
处理数组数据
数组操作语法:
语法 | 描述 |
${!array[*]} |
取关联数组所有键(索引) |
${!array[@]} | 取关联数组所有键(索引) |
${array[*]} | 取关联数组所有值(元素) |
${array[@]} |
取关联数组所有值(元素) |
${#array[@]} | 关联数组的长度(元素个数) |
${#array[*]} | 关联数组的长度(元素个数) |
引用数组中的元素:
所有元素:${ARRAY[@]}, ${ARRAY[*]}
[root@localhost ~]# echo ${weekdays[*]} Sunday Monday Tuesday Wednesday Thursday Friday Saturday [root@localhost ~]# echo ${weekdays[@]} Sunday Monday Tuesday Wednesday Thursday Friday Saturday
数组切片:${ARRAY[@]:offset:number}
offset: 要跳过的元素个数
number: 要取出的元素个数
取偏移量之后的所有元素 ${ARRAY[@]:offset}
[root@localhost ~]# echo ${weekdays[@]:2} Tuesday Wednesday Thursday Friday Saturday [root@localhost ~]# echo ${weekdays[@]:2:2} Tuesday Wednesday
向数组中追加元素:
ARRAY[${#ARRAY[*]}]
[root@localhost ~]# number[${#number[@]}]=2 [root@localhost ~]# echo ${number[@]} 1 3 5 7 9 2
删除数组中的某元素:导致稀疏格式
unset ARRAY[INDEX]
[root@localhost ~]# unset number[5] [root@localhost ~]# echo ${number[@]} 1 3 5 7 9
关联数组:
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘…)
[root@localhost ~]# declare -A num [root@localhost ~]# num=([jishu]="1 3 5" [oushu]="2 4 6") [root@localhost ~]# echo ${num[jishu]} 1 3 5 [root@localhost ~]# echo ${num[oushu]} 2 4 6
示例3:打印用户的手机号
#!/bin/bash name=(Leo Tom Lisa) declare -A phone phone=([Leo]=666 [Tom]=888 [Lisa]=999) for i in `eval echo {0..$((${#name[*]}-1))}` do echo ${name[i]} phone number is ${phone["${name[i]}"]} done
#!/bin/bash declare -A phone phone=([Leo]=666 [Tom]=888 [Lisa]=999) for key in ${!phone[*]} do echo "$key phone number is : ${phone[$key]}" done
原创文章,作者:Groot,如若转载,请注明出处:http://www.178linux.com/40377