目录:
=================
1、数组的表达方式
1.1 数组中元素的赋值方式
1.2 关联数组的表示方式
2、 数组的应用
2.1 数组的长度表示方式(数组的元素个数、数组的所有元素、数组中第一个元素的字符个数)
2.2 数组元素切片
2.3 向数组中追加元素
2.4 删除数组中的某个元素
导语:
=================
变量:存储单个元素的内存空间;
数组:存储多个元素的连续的内存空间;
数组名:整个数组只有一个名字;
数组索引:编号从数字0开始;
数组格式:数组名[索引]
bash版本4以后支持自定义索引格式,索引可使用数字以外的字符,此类数组称为”关联数组”;
对数组进行变量引用的格式:${ARRAY_NAME[INDEX]}
声明数组的方式:
declare -a NAME 声明索引数组;
declare -A NAME 声明关联数组;
正文:
======================
1、数组的表达方式
1.1 数组中元素的赋值方式
1.2 关联数组的表示方式
1.1 数组中元素的赋值方式:
>> bash支持稀疏格式的数组:就是说可以指定第一个元素’0’,然后跳到第5个元素’5’,没有指定的元素,其值为空;
>> 引用数组时如果不带数组索引,则默认显示第’0’号索引的元素;
>> 下面方式中,”ARRAY_NAME”表示数组名,”INDEX”表示数组索引的数字序号,”VALUE”表示具体的元素;
1> 一次只赋值一个元素;ARRAY_NAME[INDEX]=VALUE
[root@KOU ~]# [root@KOU ~]# animals[1]=pig [root@KOU ~]# [root@KOU ~]# animals[3]=dog [root@KOU ~]# [root@KOU ~]# echo ${animals[0]} pig [root@KOU ~]# [root@KOU ~]# echo ${animals[3]} dog [root@KOU ~]# [root@KOU ~]# echo ${animals[1]} pig [root@KOU ~]# echo ${animals[2]} [root@KOU ~]# [root@KOU ~]# animals[1]=cat [root@KOU ~]# [root@KOU ~]# echo ${animals[0]} pig [root@KOU ~]# echo ${animals[1]} cat [root@KOU ~]#
2> 一次赋值全部元素;ARRAY_NAME=(“VALUE1” “VALUE2” “VALUE3” …)
[root@KOU ~]# [root@KOU ~]# weekdays=("monday" "sunday" "wednesday") [root@KOU ~]# [root@KOU ~]# echo ${weekdays[0]} monday [root@KOU ~]# echo ${weekdays[1]} sunday [root@KOU ~]# echo ${weekdays[2]} wednesday [root@KOU ~]# echo ${weekdays[3]} [root@KOU ~]#
3> 只赋值特定元素;ARRAY_NAME=([0]=”VALUE1″ [4]=”VALUE3″ …)
[root@KOU ~]# [root@KOU ~]# jinrong=([0]="shediao" [3]="yitiantulong" [8]="shengdiao") [root@KOU ~]# [root@KOU ~]# echo ${jinrong[0]} shediao [root@KOU ~]# [root@KOU ~]# echo ${jinrong[2]} [root@KOU ~]# echo ${jinrong[3]} yitiantulong [root@KOU ~]#
4> read -a ARRAY_NAME;
[root@KOU ~]# [root@KOU ~]# read -a huashan dongxue xidu nandi beigai wangchongyang [root@KOU ~]# [root@KOU ~]# echo ${huashan[0]} dongxue [root@KOU ~]# echo ${huashan[1]} xidu [root@KOU ~]#
1.2 关联数组的表示方式,先要定义关联数组”declare -A NAME”,然后才对元素赋值;
declare -A ARRAY_NAME
ARRAY_NAME[asso_name1]=VALUE1
ARRAY_NAME=([asso_name1]=”VALUE1″ [asso_name2]=”VALUE2″ …)
[root@KOU ~]# [root@KOU ~]# declare -A riben [root@KOU ~]# [root@KOU ~]# riben[rb1]=tokyo [root@KOU ~]# [root@KOU ~]# riben[rb3]=oosaka [root@KOU ~]# [root@KOU ~]# riben[rb4]=kyotou [root@KOU ~]# [root@KOU ~]# echo ${riben[rb0]} [root@KOU ~]# echo ${riben[rb1]} tokyo [root@KOU ~]# [root@KOU ~]# echo ${riben[rb2]} [root@KOU ~]# echo ${riben[rb3]} oosaka [root@KOU ~]# [root@KOU ~]# [root@KOU ~]# echo ${#riben[*]} 3 [root@KOU ~]# echo ${#riben[@]} 3 [root@KOU ~]#
**************************************************************************
2、 数组的应用
2.1 数组的长度表示方式(数组的元素个数、数组的所有元素、数组中第一个元素的字符个数)
2.2 数组元素切片
2.3 向数组中追加元素
2.4 删除数组中的某个元素
2.1 数组的长度表示方式:
${#ARRAY_NAME[*]} 表示数组中元素个数;
${#ARRAY_NAME[@]} 表示数组中元素个数;
${#ARRAY_NAME} 表示数组中第一个元素的字符个数;
${ARRAY_NAME[*]} 表示数组中的所有元素;
${ARRAY_NAME[@]} 表示数组中的所有元素;
[root@KOU ~]# [root@KOU ~]# jinrong=([0]="shediao" [3]="yitiantulong" [8]="shengdiao") [root@KOU ~]# [root@KOU ~]# read -a huashan dongxue xidu nandi beigai wangchongyang [root@KOU ~]#
查看数组中的元素个数; ----------------------------- [root@KOU ~]# echo ${#huashan[*]} 5 [root@KOU ~]# echo ${#jinrong[*]} 3 [root@KOU ~]# [root@KOU ~]# echo ${#jinrong[@]} 3 [root@KOU ~]# 查看数组中第一个元素的字符个数; ------------------------------------ [root@KOU ~]# [root@KOU ~]# echo ${huashan[0]} dongxue [root@KOU ~]# [root@KOU ~]# echo ${#huashan} 7 [root@KOU ~]# 查看数组中的所有元素; -------------------------------------- [root@KOU ~]# [root@KOU ~]# echo ${huashan[*]} dongxue xidu nandi beigai wangchongyang [root@KOU ~]# [root@KOU ~]# echo ${huashan[@]} dongxue xidu nandi beigai wangchongyang [root@KOU ~]#
**************************************************
示例1:求10个随机数中最大数与最小数,分别显示出来;
#!/bin/bash # declare -a rand declare -i max=0 declare -i min=65535 for i in {0..9}; do rand[$i]=$RANDOM echo "${rand[$i]}" [ ${rand[$i]} -gt $max ] && max=${rand[$i]} [ ${rand[$i]} -lt $min ] && min=${rand[$i]} done echo echo -e "MAX:$max.\nMIN:$min." ---------------------------------------------------------------------------- #!/bin/bash # declare -a rand declare -i max=0 declare -i min=65535 for ((i=0;i<=9;i++)); do rand[$i]=$RANDOM echo "${rand[$i]}" [ ${rand[$i]} -gt $max ] && max=${rand[$i]} [ ${rand[$i]} -lt $min ] && min=${rand[$i]} done echo echo -e "MAX:$max.\nMIN:$min."
示例2:定义一个数组,数组中的元素是/var/log/*.log目录下的所有以.log结尾的文件;统计其下标为偶数的文件中的行数之和;
#!/bin/bash # declare -a files files=(/var/log/*.log) declare -i lines=0 for i in $(seq 0 $[${#files[*]}-1]); do if [ $[$i%2] -eq 0 ]; then let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1) fi done echo "lines:$lines."
示例3:生成10个随机数,并由小到大排序(冒泡排序法);
#!/bin/bash # declare -i i=1 while [ $i -le 10 ]; do if [ $i -eq 1 ]; then a[$i]=$RANDOM else j=$i a[$j]=$RANDOM while [ $j -ge 2 ] && [ ${a[$j]} -le ${a[$(($j-1))]} ]; do t=${a[$j]} a[$j]=${a[$(($j-1))]} a[$(($j-1))]=$t let j-- done fi let i++ done echo ${a[@]}
2.2 数组元素切片
${ARRAY_NAME[@]:offset:number}
${ARRAY_NAME[*]:offset:number}
offset:偏移量,表示从第一个元素开始计算,要跳过多少个元素;
number:表示要取出多少个元素;省略’number’,则表示偏移量之后的所有元素;
举例:
[root@KOU abc]# [root@KOU abc]# file=(/etc/[Pp]*) [root@KOU abc]# [root@KOU abc]# echo ${file[@]} /etc/PackageKit /etc/pam.d /etc/passwd /etc/passwd- /etc/pbm2ppa.conf /etc/pinforc /etc/pkcs11 /etc/pki /etc/plymouth /etc/pm /etc/pnm2ppa.conf /etc/polkit-1 /etc/popt.d /etc/postfix /etc/ppp /etc/prelink.conf.d /etc/printcap /etc/profile /etc/profile.d /etc/protocols /etc/pulse /etc/purple /etc/python [root@KOU abc]# [root@KOU abc]# echo ${file[@]:2:5} /etc/passwd /etc/passwd- /etc/pbm2ppa.conf /etc/pinforc /etc/pkcs11 [root@KOU abc]# [root@KOU abc]# echo ${file[@]:5:3} /etc/pinforc /etc/pkcs11 /etc/pki [root@KOU abc]# [root@KOU abc]# echo ${file[@]:3} /etc/passwd- /etc/pbm2ppa.conf /etc/pinforc /etc/pkcs11 /etc/pki /etc/plymouth /etc/pm /etc/pnm2ppa.conf /etc/polkit-1 /etc/popt.d /etc/postfix /etc/ppp /etc/prelink.conf.d /etc/printcap /etc/profile /etc/profile.d /etc/protocols /etc/pulse /etc/purple /etc/python [root@KOU abc]#
2.3 向数组中追加元素
向非稀疏格式的数组中追加元素:
ARRAY_NAME[${#ARRAY_NAME[*]}]=VALUE
ARRAY_NAME[${#ARRAY_NAME[@]}]=VALUE
2.4 删除数组中的某个元素
unset ARRAY_NAME[INDEX]