shell数组
变量为存储单个元素最小单元,数组是存放多个元素的集合
目标
- 在实际运用中掌握数组的具体用途,注意关联数组的灵活运用
- 理解数组的全部元素,元素下标以及元素的切片和替换,具体场景配合使用
- 数组一般用来统计批量的内容。例如批量文件的计算等,配合其它命令使用
一、shell数组概述
1.数组是什么
数组就是一系列数据的集合,这里所说的数据就是之前学习的单个变量,也就是说将一系列的变量存储一个集合内,这个集合就是数组。在shell数组中仅支持一维数组数组元素的下标从0开始,数组元素没有最大限制。
2.为什么要用数组?
与变量同样的道理,需要批量操作数据时,一个一个操作变量非常不方便,可以使用一个数组集合,对整个数组集合进行遍历or其它操作,最终实现批量效果,数组使脚本更具扩展性
3.变量与数组的差异
变量是存储单个数据的单元,在内存中是随机存储中,数组会事先在内存中开辟出一系列的空间,之后将数组有序的存储其中。
二、数组的基本使用
1.数组的定义
直接定义(一次定义多个)
数组类似于变量定义,数组可以一次定义多个变量,用()将变量包围。每个元素用空格分隔。shell是弱类型的,一个数组可以存放int数据类型,也可以存放字符串
ARG1=(1 2 3 hello "hello paipai" 6 7)
ARG为数组的名称,包含数字、字符串
单元素定义(挨个定义)
在数组中下标从0开始,利用单个元素来定义数组
[root@hcss-ecs-72ce paipai]# ARG2[0]=3
[root@hcss-ecs-72ce paipai]# ARG2[1]=2
[root@hcss-ecs-72ce paipai]# ARG2[2]=1
[root@hcss-ecs-72ce paipai]# ARG2[3]="hello xiaomi"
2.数组的元素获取
获取单个元素
echo ${数组名[n]}
[root@hcss-ecs-72ce paipai]# echo ${ARG1[3]}
hello paipai
获取全部元素
- 获取数组值
// 获取数组全部元素使用以下2种方式
echo ${数组名[@]} //方式一
echo ${数组名[*]} //方式二
实际操作
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 hello paipai
[root@hcss-ecs-72ce paipai]# echo ${ARG2[*]}
3 2 1 hello xiaomi
[root@hcss-ecs-72ce paipai]#
- 获取数组下标
// 在获取数组元素前面加一个!(在正则表达式中表示“非”)
echo ${!数组名[@]}
echo ${!数组名[*]}
[root@hcss-ecs-72ce paipai]# echo ${!ARG2[*]}
0 1 2 3
[root@hcss-ecs-72ce paipai]# echo ${!ARG2[@]}
0 1 2 3
[root@hcss-ecs-72ce paipai]#
[root@hcss-ecs-72ce paipai]# ARG2[6]=9
[root@hcss-ecs-72ce paipai]# echo ${!ARG2[@]}
0 1 2 3 6
- 获取数组长度
在获取数组全部元素前添加"#"来获取数组个数,
获取整个数组的元素长度 ${#ARG[*]} 或 ${#ARG[@]}
获取某个元素的长度
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 Hello paipai
[root@hcss-ecs-72ce paipai]# echo ${ARG1[3]}
Hello paipai
[root@hcss-ecs-72ce paipai]# echo ${#ARG1[@]}
4
获取单个元素长度
echo ${#数组名[n]}
执行结果
[root@hcss-ecs-72ce paipai]# echo ${ARG1[*]}
1 2 3 hello paipai
[root@hcss-ecs-72ce paipai]# echo ${#ARG1[*]}
4
[root@hcss-ecs-72ce paipai]# echo ${#ARG1[3]}
12
[root@hcss-ecs-72ce paipai]# echo ${#ARG1[2]}
1
[root@hcss-ecs-72ce paipai]#
3.数组元素修改
修改元素
利用数组的下标,获取这个数值,直接进行覆盖赋值
[root@hcss-ecs-72ce paipai]# ARG1=(1 2 3 "hello paipai")
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 hello paipai
[root@hcss-ecs-72ce paipai]# ARG1[3]=500
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 500
[root@hcss-ecs-72ce paipai]#
增加元素
跟修改元素形式一致,指定对应位置的元素进行赋值添加
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 500
[root@hcss-ecs-72ce paipai]# ARG1[4]=hello
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 500 hello
[root@hcss-ecs-72ce paipai]#
删除元素
unset 数组名[num] //删除对应的某个元素
unset 数组名 //删除整个数组
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 500 hello
[root@hcss-ecs-72ce paipai]# unset ARG1[0]
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
2 3 500 hello
[root@hcss-ecs-72ce paipai]#
4.数组的切片
数组可以进行切片也就是截取操作。可以通过
${数组名[@]:开始切片位置:切片长度}
对原数组进行切片,返回的为字符串,例如
[root@hcss-ecs-72ce paipai]# echo ${ARG1[*]:3:1}
hello,paipai
[root@hcss-ecs-72ce paipai]# echo ${ARG1[*]:2:2}
3 hello,paipai
[root@hcss-ecs-72ce paipai]# echo ${ARG1[*]:0:2}
1 2
[root@hcss-ecs-72ce paipai]# echo ${ARG1[*]:1:2}
2 3
[root@hcss-ecs-72ce paipai]#
5.数组的替换
将数组中的元素根据在数组中的存放位置进行替换只是在输出的时候进行替换,实际上在磁盘中并不替换
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]/1/100}
100 2 3 hello,paipai
[root@hcss-ecs-72ce paipai]# echo ${ARG1[@]}
1 2 3 hello,paipai
[root@hcss-ecs-72ce paipai]#
三、shell数组分类
1.普通数组
上述讲的以数字为下标的都是普通数组
2.关联数组
用字符串做为下标的数组,有一个前提条件,提前对这个数组进行声明
declare -A Array //定义关联数组
使用关联数组,进行赋值时,需要带上下标,否则会出现下面的错误❎,导致只有第一个数组被赋值成功了
一次对整个数组变量赋值
[root@hcss-ecs-72ce ~]# declare -A array //定义关联数组
[root@hcss-ecs-72ce ~]# array=(name1=paipai name2=lala name3=xiaomi)
[root@hcss-ecs-72ce ~]# echo ${array[@]}
(name1=paipai
[root@hcss-ecs-72ce ~]# #需要带下标直接赋值
[root@hcss-ecs-72ce ~]# array=([name1]=paiapi [name2]=duoduo [name3]=xiaomo)
[root@hcss-ecs-72ce ~]# echo ${array[@]}
xiaomo duoduo paiapi
[root@hcss-ecs-72ce ~]#
单个对数组变量赋值
可以发现关联数组存储的时候是随机的,没有正规的排序。
[root@hcss-ecs-72ce ~]# #对单个变量进行赋值
[root@hcss-ecs-72ce ~]# array[name4]=Achao
[root@hcss-ecs-72ce ~]# echo ${array[@]}
xiaomo duoduo paiapi Achao
[root@hcss-ecs-72ce ~]# array[name5]=100
[root@hcss-ecs-72ce ~]# echo ${array[@]}
xiaomo duoduo paiapi 100 Achao
[root@hcss-ecs-72ce ~]# echo ${!array[@]}
name3 name2 name1 name5 name4
[root@hcss-ecs-72ce ~]# echo ${#array[@]}
5
[root@hcss-ecs-72ce ~]#
四、实际应用
1、查看linux服务器网络连接情况
查看各个时间段服务器TCP连接情况。
netsart -ant
查看linux系统中,网络连接情况。显示系统中所有活跃的 TCP 连接及其端口和状态,且在显示时使用数字形式而非域名或服务名。这对于排查网络连接问题、监控网络活动或了解系统当前网络连接状态非常有用。
执行结果
[root@hcss-ecs-72ce paipai]# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.86:22 221.221.139.174:55994 SYN_RECV
tcp 0 0 192.168.1.86:22 221.221.139.174:38502 SYN_RECV
tcp 0 0 192.168.1.86:22 221.221.139.174:56158 SYN_RECV
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.86:36968 100.125.11.131:10180 ESTABLISHED
tcp 0 0 192.168.1.86:22 42.120.75.11:53830 ESTABLISHED
tcp 0 36 192.168.1.86:22 42.120.75.11:57390 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
[root@hcss-ecs-72ce paipai]#
查询结果各字段代表的意思
名称 | 释义 | 解释 |
---|---|---|
Proto | 协议类型 | TCP的连接类型,IPv4或ipv6 |
Recv-Q | 接收列队 | 接收到的数据包正在等待进程读取的数量。如果这个值持续增长,可能意味着接收端的应用程序没有足够快的处理数据 |
Send-Q | 发送列队 | 待发送的数据量,已经准备好发送但尚未被网络接口发送出去的数据包数量 |
Local Address | 本地地址 | 显示本地端点的IP地址和端口号。0.0.0.0:*表示监听所有IPv4地址上的指定端口,:::表示监听所有IPv6地址上的端口。 |
Foreign Address | 远端地址 | 显示远程端点的IP地址和端口号,或者对于监听中的套接字是*,表示愿意接受任何远端地址的连接。 |
State | 连接状态 | LISTEN,监听状态,服务端正在监听该端口,等待客户端连接;SYN_RECV,同步接收,服务器已经接收到SYN同步报文,等待三次握手的完成;Established,连接已建立可以双向传输 |
awk,对查询结果进行筛选
根据 “netstat -ant” 查询出来的结果,进行筛选,从第二行开始,只输出最后一列的内容
[root@hcss-ecs-72ce paipai]# netstat -ant|awk 'NR>1 {print $NF}'
State
LISTEN
LISTEN
ESTABLISHED
ESTABLISHED
LISTEN
LISTEN
[root@hcss-ecs-72ce paipai]#