六、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