title: Shell-数组-实例
date: 2020-05-05 16:51:18
categories:
- Shell
tags: - 数组
欢迎访问我的博客:https://nothingzh.gitee.io/
Nothingzh的博客
一.数组分类
普通数组:只能使用整数,作为数组索引
关联数组:可以使用字符串,作为数组索引
多用于对变量切片
1.变量
使用数组进行切割
定义一个变量
name=zxy
,取得中间的
x
,就需要使用数组
echo \"${name:0}\"
2.普通数组
只能使用整数0 1 2,作为数组索引
echo \"${book[0]}\"
等于数组中的第一个数
nginx
3.关联数组
可以使用字符串,作为数组索引
- 定义关联数组,申明是关联数组
- 关联数组
declare -A [数组名]
,
- 定义关联数组
tt=([index1]=test [index2]=test2)
。index1为索引值,test为内容
- 查看数组内容
#echo ${tt[@]}test test2
若未提前关联数组,此时查看数组内容则只输出
test2
#echo \"${tt[@]}\"test2
- 查看索引下标
#echo ${!tt[@]}index1 index2
// 每个索引进行单个赋值,流程如下:
# array1[0]=pear# array1[1]=apple# array1[2]=orange# array1[3]=peach# echo ${array1[@]}pear apple orange peach# echo ${array1[1]}apple
// 一次赋值多个值,流程如下:
索引=下标
[root@localhost ~]# arrary2=(tom jack alice)[root@localhost ~]# echo ${!arrary2[@]}0 1 2[root@localhost ~]# echo \"${arrary2[0]}\"tom分号\"\"赋值:[root@localhost ~]# arrary3=(tom jack alice \"mike jordan\")[root@localhost ~]# echo \"${arrary3[@]}\"tom jack alice mike jordan[root@localhost ~]# echo \"${!arrary3[@]}\"0 1 2 3#分号内为一个赋值,“mike jordan”是一个整体[root@localhost ~]# echo \"${arrary3[3]}\"mike jordan定义索引(下标)名称[root@localhost ~]# array4=(1 2 3 \"a and b\" [20]=world)[root@localhost ~]# echo \"${array4[@]}\"1 2 3 a and b world查看数组的索引名,会出现个20,而不是4。因为20为自定义,直接跳到20[root@localhost ~]# echo \"${!array4[@]}\"0 1 2 3 20[root@localhost ~]# echo \"${array4[3]}\"a and b查看自定义索引名的内容,[20]=world[root@localhost ~]# echo \"${array4[20]}\"world
//将
/etc/passwd
文件中的每一行作为元数赋值给数组
array5
[root@localhost ~]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin......省略[root@localhost ~]# array5=(`cat /etc/passwd`)[root@localhost ~]# echo \"${array5[0]}\"root:x:0:0:root:/root:/bin/bash[root@localhost ~]# echo \"${array5[1]}\"bin:x:1:1:bin:/bin:/sbin/nologin
//循环数组的 索引key,并循环数组的 内容value
i++ 例如int i=1,a=0; a=i++; —->a=i;—->a=a+1;—–>a=1
[root@nothingzh shell]# bash hosts_array.sh#!/bin/bash#declare -A hosts_array#1.对数组进行赋值,定义索引,$line赋值到内容while read linedohosts_array[++i]=$line #++i用于先运算等1,循环后+1# $line用于读入/etc/hosts的每一行内容done </etc/hostsecho \"first的索引值是: ${hosts_array[1]}\"#2.对数组进行遍历循环,分别输出索引对应的内容# ${!hosts_array[*]}=1 2 3 因为/etc/hosts文件中只有3行for j in ${!hosts_array[*]} #${!hosts_array[*]}获取数组的索引,下方echo配合j的变量输出1 2 3 索引下的内容doecho \"索引是:$j,hosts的内容:${hosts_array[$j]}\"done
4.查看数组赋值结果
可理解为[key]=“value”
[root@localhost ~]# declare -adeclare -a BASH_ARGC=\'()\'declare -a arrary2=\'([0]=\"tom\" [1]=\"jack\" [2]=\"alice\")\'declare -a arrary3=\'([0]=\"tom\" [1]=\"jack\" [2]=\"alice\" [3]=\"mike jordan\")\'declare -a array4=\'([0]=\"1\" [1]=\"2\" [2]=\"3\" [3]=\"a and b\" [20]=\"world\")\'declare -a array5=\'([0]=\"root:x:0:0:root:/root:/bin/bash\" [1]=\"bin:x:1:1:bin:/bin:/sbin/nologin\" [2]=\"daemon:x:2:2:daemon:/sbin:/sbin/nologin\"....
5.数组的常见用法
#号为统计个数符号
*,@ 为访问所有元素
! 为获取数组的索引
统计数组个数[root@localhost ~]# array3=(tom jack alice \"mike jordan\")[root@localhost ~]# echo \"${#array3[@]}\"4访问数组的第一个元素[root@localhost ~]# echo \"${array3[0]}\"tom从索引1开始,向后访问[root@localhost ~]# echo \"${array3[@]:1}\"jack alice mike jordan从索引1开始,向后访问2个元素[root@localhost ~]# echo \"${array3[@]:1:2}\"jack alice
6.数组案例
6.1 统计文件中男m,女f,小动物x 共有多少
// 常规linux命令统计, 统计男m,女f,动物x 共有多少
创建一份测试数据
# cat >> name-sex.txt <<EOFNAME SEXqwe mzxc mrty ffgh fzjz mbnm fgg xasd mmm xEOF
awk:过滤第二行,sort:排序,uniq -c:用于统计数量
# awk -F\' \' \'{print $2}\' name-sex.txt | sort |uniq -c3 f4 m2 x
// 使用数组统计, 统计男m,女f,小动物x 共有多少
[root@nothingzh shell]# bash array_tongji.sh#!/bin/bash#统计name_sex.txt 男m,女f,小动物x 共有多少# v1.0 by zjz 2020-05-03#!!!统计字符必须使用到关联数组!!!declare -A array_count#1.对关联数组进行赋值while read linedo#获取到name-sex.txt中的m、f、xsex=$(echo $line | awk -F\' \' \'{print $2}\')let array_count[$sex]++ #当索引中m有一个是+1,# echo ${array_count[*]}done < /root/shell/name-sex.txt#2.对关联数组进行遍历循环,分别输出索引对应的内容# 这里的i=m、f、x. ${!array_count[*]}用于取出索引for i in ${!array_count[*]}doecho \"索引名称:$i,索引所对应个数:${array_count[$i]}\"done
查看执行过程
+ read line #读一行++ echo qwe m #此行是姓名:qwe 性别:m++ awk \'-F \' \'{print $2}\' #只取m+ sex=m #索引sex=m 赋值为m+ let \'array_count[m]++\' #这里的array_count[m]++++++ 现在echo ${array_count[m]} ,它就等于1-------------+ read line++ echo fgh f++ awk \'-F \' \'{print $2}\'+ sex=f+ let \'array_count[f]++\' #这里的array_count[f]+++ read line++++ 现在echo ${array_count[f]} ,它就等于1
整体执行结果:
[root@nothingzh shell]# bash array_tongji.sh索引名称:f,索引所对应个数:3索引名称:m,索引所对应个数:4索引名称:x,索引所对应个数:2
6.2使用数组统计/etc/passwd中
/bin/bash
、
/bin/sync
等等的用户有几个。
注意! /etc/passwd文件中的halt、shutdown用户。会导致在你不经意的情况下关机
测试脚本时不建议直接对
/etc/passwd
文件进行操作。
创建测试文件:
#cp /etc/passwd /root/
[root@localhost ~]# cat /root/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/sync..........
// 使用常规命令对
passwd
文件的执行shell进行统计。
[root@localhost ~]# cat /root/passwd | awk -F\':\' \'{print $NF}\' | sort | uniq -c4 /bin/bash1 /bin/sync14 /sbin/nologin1 /sbin/qqqq1 /sbin/wwwwwww
//使用数组进行统计
/bin/bash
、
/bin/sync
等等的用户有几个
[root@localhost ~]# cat array_count_bash.sh#!/bin/bash#用户/etc/passwd 文件/bin/bash等等的用户名有多少个#v1.0 by zjz 2020-05-04#1.数组中的索引用到字符的,必须先声明为关联数组declare -A array_count_bash#2.对关联数组用的 索引 进行赋值while read linedoshell=$(echo $line|awk -F\':\' \'{print $NF}\')let array_count_bash[$shell]++ #索引 赋值后 ++ 进行自加1done < /root/passwd#3. 对关联数组进行遍历循环,分别输出索引对应的内容#$i = ${!array_count_bash[$i]} = /bin/bash /sbin/nologin 等等#${array_count_bash[*]} = 14 1 1 1 4for i in ${!array_count_bash[*]} #${!array_count_bash[*]} !用于取得索引doecho \"suoying-name:$i ====> suoying-count:${array_count_bash[$i]}\"done
执行结果:
[root@localhost ~]# bash array_count_bash.shsuoying-name:/sbin/nologin ====> suoying-count:14suoying-name:/sbin/qqqq ====> suoying-count:1suoying-name:/sbin/wwwwwww ====> suoying-count:1suoying-name:/bin/sync ====> suoying-count:1suoying-name:/bin/bash ====> suoying-count:4
6.3 统计当前主机ss -an 的监听状态
//使用常规Linux命令统计
# ss -an | awk \'{print $2}\' | sort | uniq -c
执行结果
[root@localhost ~]# ss -an | awk \'{print $2}\' | sort | uniq -c91 ESTAB35 LISTEN1 State67 UNCONN
//使用关联数组统计当前主机ss -an 的监听状态
[root@localhost ~]# cat array_status.sh#!/bin/bash# 统计当前主机ss -an 的监听状态# v1.0 by zjz 2020-05-05#1.数组中的索引用到字符的,必须先声明为关联数组declare -A array_state#2.获取索引 统计的**对象**state=$(ss -an | awk \'{print $2}\')#3.对统计的**对象**进行累加for i in $statedolet array_state[$i]++done#4.对关联数组进行遍历循环,分别输出索引对应的内容for j in ${!array_state[*]}doecho \"STATUS: $j, STATUS Count:${array_state[$j]}\"done
执行结果:
#watch -n1 bash array_status.sh
每1s刷新一次结果
[root@localhost ~]# bash array_status.shSTATUS: ESTAB, STATUS Count:91STATUS: UNCONN, STATUS Count:67STATUS: State, STATUS Count:1STATUS: LISTEN, STATUS Count:35
运用实例:
- 统计文件中男m,女f,小动物x 共有多少个
- 统计/etc/passwd中
/bin/bash
、
/bin/sync
等等的用户有几个。
总结上面实例 关联数组:
– 数组中的索引用到字符的,必须先声明为关联数组
– array_test={ [索引] =内容}
————————————–
* | @ 为访问所有元素
! 为获取数组的索引
—————————————
– 索引 统计的对象
– 内容 统计名称的数量
—————————————
– 处理文件对用while read line 取索引对象
– 程序运行结果用for进行循环统计
[root@localhost ~]# declare -A array_test[root@localhost ~]# array_test=([zjz]=pt [zxy]=pt [xyx]=zz)[root@localhost ~]# echo ${array_test[*]}pt zz pt[root@localhost ~]# echo ${!array_test[*]}zjz xyx zxy
更多更好的原创文章,请访问官方网站: 点我就能跳转咯-》https://nothingzh.gitee.io
也可关注“哎呦运维”微信订阅号,随时接受文章推送。