六、shell数组实战实例

六、shell数组

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

数组分类

1.普通变量
name=tianyun
+--------------------+
|t |i |a |n |y |u |n |  变量值
----------------------
|0 |1 |2 |3 |4 |5 |6 |	索引
+--------------------+

2.普通数组
books=(linux shell awk openstack docker)
+------------------------------------+
|linux |shell |awk |openstack |docker| 变量
--------------------------------------
|   0  |  1   | 2  |    3     |   4  |  索引(下标)
+------------------------------------+

3.关联数组
info=([name]=shm [sex]=man [age]=21 [height]=175 [skill]=cloud)
+---------------------------------+
|shm  |man  |21   | 175    |cloud |  
-----------------------------------
|name |sex  |age  | height |skill |  索引(字符索引)
+---------------------------------+

1、创建数组的命令,declare

-a:定义成普通数组 declare -a 数组名
-A:定义成关联数组 declare -A 数组名

2、为数组添加数据

在后面为单独讲到,普通数组和关联数组不同的添加数据方法

3、访问数组元数

echo ${数组名[索引下标]}

echo ${array[0]} 访问数组中的第一个元数
echo ${array[@]} 访问数组中的所有元数,等同于 ${array[*]}
echo ${#array[@]} 统计数组中元数的个数

重点1:遍历数组

echo ${array[@]} 获取数组中的所有元素
echo ${#array[@]} 获取数组中的所有元素总数
echo ${!array[@]} 获取数组中所有元数的索引下标
在这里插入图片描述

重点2:数组切片

echo ${array[@]:2} 从数组下标2开始
echo ${array[@]:2:2} 从数组下标2开始,只访问2个元素


一、普通数组

定义数组分为两种方法

方法一:一次赋一个值

数组名[下标]=变量值
#array1[0]=pear
#array1[1]=apple
#array1[2]=orange
#array1[3]=banana

案例1:以数组的形式遍历/etc/hosts文件
#!/bin/bash
通过读取一个文件,来循环为数组赋值,每次只赋一个值
while read line
do
	hosts[++i]=$line
done </etc/hosts
输出数组得到第一个值
echo "hosts first:${hosts[1]}"

遍历数组中的所有索引下标
for i in ${!hosts[@]}
do
	输出下标:对应索引下标的值
	echo "$i:${hosts[i]}"
done

[root@localhost shell]# sh array_hosts.sh 
host first: 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
1:127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2:::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
3:192.168.10.1  www.shm.com
4:192.168.10.2  web.shm.com
5:192.168.10.3  php.shm.com
6:

方法二:一次赋多个值

#array2=(tom jack alice)
#array3=(`cat /etc/passwd`)
#array4=(`ls /var/ftp/shell/for*`)
#array5=(tom jack alice “bash shell”) 4个元素,引号内的属于一个元素
#colors=($red $blue $green r e c o l o r ) 4 个 颜 色 , 每 一 个 recolor) 4个颜色,每一个 recolor)4代表一个变量

二、关联数组

数组建立时默认为普通数组,所以不需要用declare -a 提前指定。但是关联数组需要在脚本行首提前指定。

declare -A 数组名
数组名=([key1]=value [key2]=value … )
数组名+=([key3]=value) #追加元素到数组当中


实例1:统计男女

let 数组名[元素]++ 自增数组元素的值,自增+1

#!/bin/bash
declare -A sex
while read line
do
        type=`echo $line | awk '{print$2}'`
        let sex[$type]++
        #let sex[m]++  / let sex[f]++
done < sex.txt

for i in ${!sex[@]}
do
        echo "$i:${sex[$i]}"
done

案例2:统计不同类型的shell环境有多少个

#!/usr/bin/bash
declare -A shells
while read line
do
        type=`echo $line | awk -F ":" '{print $NF}'`
        let shells[$type]++
done < /etc/passwd


for i in ${!shells[@]}
do
        echo "$i: ${shells[$i]}"
done

案例3: 统计网站的所有连接状态以及数量

#!/bin/bash
count tcp status
v1.0 by shm

declare -A status
while :
do
	获取所有的连接状态
	type=`ss -an | grep :80 | awk '{print $2}'`

	将所有连接状态生成一个数组
	for i in $type
	do
	   let status[$i]++
	done

	遍历数组的值和数量
	for j in ${!status[@]}
	do
	   echo "$j:${status[$j]}"
	done
	sleep 5
	clear
done

执行脚本:在一个小时内不间断统计访问状态
watch -n1 ./count_tcpconn_status.sh


案例4:统计网站的IP访问数量

cat /var/log/httpd/access_log | awk ‘{if($1~/^1/)print$1}’

cat /var/log/httpd/access_log | awk ‘{print $9}’

#!/bin/bash

declare -A tcps
while read line
do
        type=`echo $line | awk '{if($1~/^1/)print$1}'`
        if [ ! ${#type} -eq 0 ];then
                type2=`echo $line  | awk '{print $9}'`
                let tcps[$type]++
                let tcps[$type2]++
        fi
done < /var/log/httpd/access_log

for i in ${!tcps[@]}
do
        echo "$i:${tcps[$i]}"
done
~                

[root@localhost shell]# sh tcp.sh
200:9
192.168.10.1:8
192.168.10.3:3
403:2

在一个小时内不间断获取IP访问数量
watch -n1 ./count_ip.sh

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值