认识数组:
变量是存储单个元素的内存空间,而数组就是多个变量的合集,是一串连续的空间,但是,整个数组只能有一个名字。
数组内的数据都有指定的索引,以找到数组内指定的数据。索引的编号是从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


