07.Shell数组应用

徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208

数组其实也算是变量, 传统的变量只能存储一个值, 但数组可以存储多个值。

1.数组分类

普通数组:只能使用整数 作为数组索引
关联数组:可以使用字符串 作为数组索引

2.普通数组

1.数组赋值方式一, 针对每个索引进行赋值

#数组名[索引]=变量值
[root@Shell ~]# array1[0]=pear
[root@Shell ~]# array1[1]=apple
[root@Shell ~]# array1[2]=orange
[root@Shell ~]# array1[3]=peach

2.数组赋值方式二, 一次赋多个值

#数组名=(多个变量值)
[root@Shell ~]# array2=(tom jack alice)
[root@Shell ~]# array3=(tom jack alice "bash shell")
[root@Shell ~]# array4=(1 2 3 "linux shell" [20]=puppet)

3.查看数组赋值结果

[root@Shell ~]# declare -a
[root@Shell ~]# declare -A

4.如何访问数组中的元数

[root@Shell ~]# echo ${array1[0]}       //访问数组中的第一个元素
[root@Shell ~]# echo ${array1[@]}       //访问数组中所有数据,相当于echo ${array1[*]}
[root@Shell ~]# echo ${#array1[@]}      //统计数组元数的个数

//了解
[root@Shell ~]# echo ${array1[@]:1}     //从数组索引1开始
[root@Shell ~]# echo ${array1[@]:1:2}   //从数组索引1开始,访问两个元素

5.如何访问数组中的索引

//获取数组元数的索引
[root@Shell ~]# echo ${!array1[@]}
0 1 2 3

3.关联数组

1.定义关联数组, 申明是关联数据

[root@Shell ~]# declare -A tt_array_1
[root@Shell ~]# declare -A tt_array_2

2.关联数组赋值方式一, 针对每个索引进行赋值

#数组名[索引]=变量值 
[root@Shell ~]# tt_array1[index1]=pear
[root@Shell ~]# tt_array1[index2]=apple
[root@Shell ~]# tt_array1[index3]=orange
[root@Shell ~]# tt_array1[index4]=peach

3.关联数组赋值方式二, 一次赋多个值

[root@Shell ~]# tt_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')

4.查看关联数组

[root@Shell ~]# declare -A

5.访问数据元数

[root@Shell ~]# echo ${tt_array2[index2]}   //访问数组中的第二个元数
[root@Shell ~]# echo ${tt_array2[@]}    //访问数组中所有元数 等同于 echo ${array1[*]}
[root@Shell ~]# echo ${!tt_array2[@]}   //访问数组中所有元数的索引

4.遍历数组

1.通过数组元数的个数进行遍历(不推荐)
2.通过数组元数的索引进行遍历(推荐)
注意: 将统计的对象作为数组的索引, 仅针对关联数据

1.数组赋值与遍历示例

#!/usr/bin/bash
#1.使用while读入一个文件
while read line
do
    #2.定义普通数组, 将读入的每行数据,单个单个进行赋值
    hosts[++i]=$line
done </etc/hosts

#3.使用for循环遍历数组, 遍历数组的索引
for i in ${!hosts[@]}
do
    echo "hosts数组对应的索引是:$i, 对应的值是: ${hosts[i]}"
done

2.使用数组统计文件中的男女性别

//1.准备对应的文件
[root@Shell ~]# cat sex.txt
jack m
alice f
tom m
rose f
robin m
bgx m

[root@Shell ~]# cat count_sex.sh
#!/usr/bin/bash
declare -A sex
#1.对数组进行赋值
while read line
do
    #2.取出第二列的内容
    type=$(echo $line|awk '{print $2}')
    #3.定义一个关联数组,让数组的值不断自增
    let sex[$type]++
done< sex.txt

#4.遍历数组
for i in ${!sex[@]}
do
    echo "$i ${sex[$i]}"
done

#5.步骤拆分讲解
[root@Shell ~]# declare -A sex
[root@Shell ~]# sex=([m]=1 [f]=1)
[root@Shell ~]# let sex[m]++
[root@Shell ~]# let sex[f]++
[root@Shell ~]# echo ${!sex[@]}
f m
[root@Shell ~]# echo ${sex[@]}
3 3

3.使用数组统计/etc/passwdshell的数量

[root@Shell ~]# cat array_passwd_count.sh
#!/usr/bin/bash
declare -A array_passwd
#1.对数组进行赋值
while read line
do
    type=$(echo $line|awk -F ':' '{print $NF}')
    let array_passwd[$type]++
done </etc/passwd

#2.对数组进行遍历
for i in ${!array_passwd[@]}
do
    echo 索引是:$i,索引的值是: ${array_passwd[$i]}
done

4.统计Nginx日志IP访问次数

[root@Shell ~]# cat array_nginx_count.sh
#!/usr/bin/bash
# nginx log top 10 IP conut
declare -A array_nginx
#1.给关联数组的索引进行赋值
while read line
do
    type=$(echo $line|awk '{print $1}')
    let array_nginx[$type]++
done </var/log/nginx/access.log

#2.遍历数组
for i in ${!array_nginx[@]}
do
    echo "IP是:$i 出现多少次${array_nginx[$i]}"
done

5.统计tcp的状态信息

[root@Shell ~]# cat array_ss_state.sh
#!/usr/bin/bash

declare -A array_state
type=$(ss -an |grep :80|awk '{print $2}')
#1.对数组进行的索引赋值
for i in $type
do
    let array_state[$i]++
done

#2.遍历数组
for j in ${!array_state[@]}
do
    echo "当前的状态是:$j,当前状态出现了多少次:${array_state[$j]}"
done