第六章 Shell数组应用
1. 数组基本概述
01. 什么是数组?
数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值。
02. 数组的分类
Shell数组分为普通数组和关联数组。普通数组:只能使用整数作为数组索引。关联数组:可以使用字符串作为数组索引。
2. 数组基本使用
01. 普通数组仅能使用整数来作为索引
#普通数组赋值方式
1.方式一:针对每个索引进行赋值
[root@gjy ~]# array1[0]=pear [root@gjy ~]# array1[1]=apple [root@gjy ~]# array1[2]=orange [root@gjy ~]# array1[3]=peach
2.方式二:一次赋多个值,数组名=(多个变量值)
[root@gjy ~]# array2=(tom jack alice) [root@gjy ~]# array3=(tom jack alice "bash shell") [root@gjy ~]# array4=(1 2 3 "linux shell" [20]=puppet)
3.方式三:将该文件中的每一个列作为一个元数赋值给数组array5,默认以空格为分割符
[root@gjy ~]# array5=(`cat /etc/passwd`)
02. 如何查看普通数组的赋值与访问数组的内容
1.定义普通数组,其实也可以不用定义
[root@gjy ~]# declare -a array
2.统计数组元数的个数
[root@gjy ~]# echo ${#array1[@]} 4
3.访问数组中的第一个元素
[root@gjy ~]# echo ${array1[0]} pear
4.从数组索引1开始
[root@gjy ~]# echo ${array1[@]:1} apple orange peach
5.从数组索引1开始,访问两个元素
[root@gjy ~]# echo ${array1[@]:1:2} apple orange
6.访问数组中所有数据,相当于echo ${array1[*]}
[root@gjy ~]# echo ${array1[@]} pear apple orange peach
03. 关联数组能使用字符串的方式作为索引
关联数组赋值
1.定义关联数组, 申明是关联数据
[root@gjy ~]# declare -A tt_array_1 [root@gjy ~]# declare -A tt_array_2
2.方式一:给关联数组进行赋值,数组名[索引]=变量值
[root@gjy ~]# tt_array1[index1]=pear [root@gjy ~]# tt_array1[index2]=apple [root@gjy ~]# tt_array1[index3]=orange [root@gjy ~]# tt_array1[index4]=peach
3.方式二:给关联数组一次赋多个值
[root@gjy ~]# tt_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')
4.查看关联数组
[root@gjy ~]# declare -A
04. 如何访问关联数组中的数据。
#1.访问数组中的第二个元数 [root@gjy ~]# echo ${tt_array2[index2]} jack #2.访问数组中所有元数 等同于 echo ${array1[*]} [root@gjy ~]# echo ${tt_array2[@]} bash shell tom jack alice #3.访问数组中所有元数的索引 [root@gjy ~]# echo ${!tt_array2[@]} index4 index1 index2 index3
3. 数组遍历与循环
方式一:通过数组元数的个数进行遍历(不推荐) 。
方式二:通过数组元数的索引进行遍历(推荐)
注意: 将统计的对象作为数组的索引,仅针对关联数据。
01.普通数组赋值与遍历示例
[root@gjy ~]# cat array-1.sh #!/usr/bin/bash #1.使用while读入一个文件 while read line do #2.定义普通数组, 将读入的每行数据,单个单个进行赋值 hosts[i++]=$line #正常定义普通数组是hosts[1]=test,只不过我们将[]变成自增 #$line是读取的文件内容 done </etc/hosts #3.使用for循环遍历数组, 遍历数组的索引 for i in ${!hosts[@]} do echo "hosts数组对应的索引是:$i, 对应的值是: ${hosts[i]}" done
02.使用关联数组统计文件中的每个Shell数量
[root@gjy ~]# cat count_passwd.sh #!/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 "Shell: $i count: ${array_passwd[$i]}" done #步骤拆分讲解 [root@gjy ~]# declare -A array_passwd [root@gjy ~]# array_passwd=([/bin/bash]=1 [/sbin/nologin]=1) [root@gjy ~]# let array_passwd[/bin/bash]++ [root@gjy ~]# let array_passwd[/sbin/nologin]++ [root@gjy ~]# echo ${!array_passwd[@]} /sbin/nologin /bin/bash [root@gjy ~]# echo ${array_passwd[@]} 2 2
03. 统计Nginx日志IP访问次数
[root@gjy ~]# 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
04. 统计tcp的状态信息
[root@gjy ~]# cat array_ss_state.sh #!/usr/bin/bash declare -A array_state type=$(ss -ant |sed '1d' |awk '{print $1}') #1.对数组进行的索引赋值 for i in $type do let array_state[$i]++ done #2.遍历数组 for j in ${!array_state[@]} do echo "当前的状态是:$j,当前状态出现了多少次:${array_state[$j]}" done