【运维知识高级篇】超详细的Shell编程讲解5(普通数组+关联数组+抓阄项目)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【运维知识高级篇】超详细的Shell编程讲解5(普通数组+关联数组+抓阄项目)

本篇文章继续给大家介绍Shell编程,给大家介绍数组相关内容,再配合之前内容,基本已经能够完成Shell中的绝大部分需求了。


数组

之前的变量好比一个箱子装一个东西,数组相当于是一个箱子里装多个小箱子,小箱子里装东西,每个东西都有编号

一、普通数组

只能以数字整数作为索引(元素名称,也叫下标)

1、语法结构

数组名称[元素名称]=元素的值

2、数组定义方法

1、按照索引定义

1. [root@Web01 ~]# array[0]=shell
2. [root@Web01 ~]# array[1]=mysql
3. [root@Web01 ~]# array[2]=docker

查看数组的值

1. [root@Web01 ~]# echo ${array[0]}
2. shell
3. [root@Web01 ~]# echo ${array[1]}
4. mysql
5. [root@Web01 ~]# echo ${array[2]}
6. docker
7. [root@Web01 ~]# echo ${array[*]}
8. shell mysql docker
9. [root@Web01 ~]# echo ${array[@]}
10. shell mysql docker

查看数组索引(下标、元素名称)

1. [root@Web01 ~]# echo ${!array[*]}
2. 0 1 2

取消数组

1. [root@Web01 ~]# unset array
2. [root@Web01 ~]# echo ${!array[*]}
3. 
4. [root@Web01 ~]#

2、直接赋值定义

注意默认索引从0开始

1. [root@Web01 ~]# array=(shell test hehe docker k8s)
2. [root@Web01 ~]# echo ${!array[*]}
3. 0 1 2 3 4
4. [root@Web01 ~]# echo ${array[*]}
5. shell test hehe docker k8s

3、混合定义

1. [root@Web01 ~]# array=([5]=shell test hehe docker [20]=k8s)
2. [root@Web01 ~]# echo ${!array[*]}
3. 5 6 7 8 20
4. [root@Web01 ~]# echo ${array[*]}
5. shell test hehe docker k8s

4、支持命令的取值定义

1. [root@Web01 ~]# array=(`echo shell mysql redis`)
2. [root@Web01 ~]# echo ${array[*]}
3. shell mysql redis
4. [root@Web01 ~]# echo ${!array[*]}
5. 0 1 2

3、ping以下IP,查看是否能ping通(数组定义的值通过for循环的方式取出来)

1. 10.0.0.2
2. 10.0.0.4
3. 202.106.0.20
4. 114.114.114
5. 223.5.5.5
6. 8.8.8.8

可以通过取数组值的方式遍历

1. [root@LB00 Day05]# cat ping.sh
2. #!/bin/basha
3. ip=(
4. 10.0.0.2
5. 10.0.0.4
6. 202.106.0.20
7. 114.114.114
8. 223.5.5.5
9. 8.8.8.8
10. 1.5.4.9
11. )
12. for i in ${ip[*]}
13. do
14.   ping -c1 -W1 $i &> /dev/null
15.   if [ $? == 0 ];then
16.     echo $i 可以通 
17.   else
18.     echo $i 不通
19.   fi
20. done
21. [root@LB00 Day05]# sh ping.sh
22. 10.0.0.2 可以通
23. 10.0.0.4 可以通
24. 202.106.0.20 不通
25. 114.114.114 不通
26. 223.5.5.5 可以通
27. 8.8.8.8 可以通
28. 1.5.4.9 不通

还可以通过取索引的方式遍历

1. [root@LB00 Day05]# cat ping.sh
2. #!/bin/basha
3. ip=(
4. 10.0.0.2
5. 10.0.0.4
6. 202.106.0.20
7. 114.114.114
8. 223.5.5.5
9. 8.8.8.8
10. 1.5.4.9
11. )
12. for i in ${!ip[*]}
13. do
14.        ping -c1 -W1 ${ip[$i]} &> /dev/null
15. if [ $? == 0 ];then
16.                echo ${ip[$i]} 可以通 
17. else
18.                echo ${ip[$i]} 不通
19.        fi
20. done
21. [root@LB00 Day05]# sh ping.sh
22. 10.0.0.2 可以通
23. 10.0.0.4 可以通
24. 202.106.0.20 不通
25. 114.114.114 不通
26. 223.5.5.5 可以通
27. 8.8.8.8 可以通
28. 1.5.4.9 不通

二、关联数组

可以以字符串作为索引

定义方式与普通数组一样,字符串数组不认识,所以会默认为0

1. [root@LB00 Day05]# array[index1]=shell
2. [root@LB00 Day05]# array[index2]=mysql
3. [root@LB00 Day05]# array[index3]=redis
4. [root@LB00 Day05]# echo ${array[*]}
5. redis
6. [root@LB00 Day05]# echo ${!array[*]}
7. 0

声明为关联数组,让字符串认识

1. [root@LB00 Day05]# unset array
2. [root@LB00 Day05]# declare -A array
3. [root@LB00 Day05]# array[index1]=shell
4. [root@LB00 Day05]# array[index2]=mysql
5. [root@LB00 Day05]# array[index3]=redis
6. [root@LB00 Day05]# echo ${array[*]}
7. shell mysql redis
8. [root@LB00 Day05]# echo ${!array[*]}
9. index1 index2 index

1、判断文本中男女数量

1. [root@LB00 Day05]# cat xingbie.txt
2. boy
3. girl
4. boy
5. boy
6. girl
7. xxx
8. [root@LB00 Day05]# declare -A array
9. [root@LB00 Day05]# let array[boy]++    #通过数组元素值自增去判断数量
10. [root@LB00 Day05]# echo ${array[boy]}    #就是元素值是数字,下标是文字
11. 1
12. [root@LB00 Day05]# let array[boy]++
13. [root@LB00 Day05]# echo ${array[boy]}
14. 2
15. 
16. [root@LB00 Day05]# cat array.sh
17. #!/bin/bash
18. declare -A array
19. while read line
20. do
21.   let array[$line]++
22. done<xingbie.txt
23. 
24. for i in ${!array[*]}
25. do
26.   echo $i 出现了 ${array[$i]} 次
27. done
28. [root@LB00 Day05]# sh array.sh
29. xxx 出现了 1 次
30. girl 出现了 2 次
31. boy 出现了 3 次

2、统计IP出现的次数

1. [root@LB00 Day05]# cat count_ip.sh
2. #!/bin/bash
3. declare -A array
4. while read line
5. do
6.  ip=`echo $line|awk '{print $1}'`
7.  let array[$ip]++
8. done</var/log/nginx/access.log
9. 
10. for i in ${!array[*]}
11. do
12.   echo $i 出现了 ${array[$i]} 次
13. done
14. [root@LB00 Day05]# sh count_ip.sh
15. 172.16.1.5 出现了 207 次

抓阄项目

需求:

1、输入姓名,姓名后面出现一个1-100的随机数

2、出现过的数字不能再出现

3、最后取随机数的TOP排行

1. [root@LB00 Day05]# cat zhuajiu.sh
2. #!/bin/bash
3. while true
4. do
5. menu(){
6. echo -e "\t\t\t\033[31m 1.抓阄 \033[0m"
7. echo -e "\t\t\t\033[32m 2.当前排名 \033[0m"
8. }
9. menu
10. read -p "请输入模式的编号[1|2]: " moshi
11. case $moshi in
12.   1)
13.   read -p "请输入你的姓名: " name
14.   while true
15.   do
16.   ran=`echo $((RANDOM%100+1))`
17.   if [ -f ran.txt ];then
18.     if [ `grep -w $ran ran.txt|wc -l` == 1 ];then
19.       continue
20.     else
21.       echo $name $ran >> ran.txt 
22.       break
23.     fi
24.   else
25.     echo $name $ran >> ran.txt
26.     break
27.   fi
28.   done
29.   echo 名字为 $name 号码为 $ran
30.   ;;
31.   2)
32.   echo 抓阄排行如下
33.   if [ -f ran.txt ];then
34.     sort -rnk2 ran.txt
35.   else
36.     echo 当前还没有排名
37.   fi
38.   ;;
39.   *)
40.   echo "Usage: [1|2]"
41. esac
42. done
43. [root@LB00 Day05]# sh zhuajiu.sh
44.        1.抓阄 
45.        2.当前排名 
46. 请输入模式的编号[1|2]: 1
47. 请输入你的姓名: q
48. 名字为 q 号码为 32
49.        1.抓阄 
50.        2.当前排名 
51. 请输入模式的编号[1|2]: 1
52. 请输入你的姓名: w
53. 名字为 w 号码为 55
54.        1.抓阄 
55.        2.当前排名 
56. 请输入模式的编号[1|2]: 1
57. 请输入你的姓名: e
58. 名字为 e 号码为 51
59.        1.抓阄 
60.        2.当前排名 
61. 请输入模式的编号[1|2]: 2
62. 抓阄排行如下
63. w 55
64. e 51
65. q 32
66.        1.抓阄 
67.        2.当前排名 
68. 请输入模式的编号[1|2]: ^Z
69. [17]+  Stopped                 sh zhuajiu.sh

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6天前
|
Unix Linux Shell
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
58 0
|
6天前
|
Shell C++ 开发者
【Shell 编程指南】Shell运算操作符之$[]详解
【Shell 编程指南】Shell运算操作符之$[]详解
24 0
|
6天前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
14 1
|
6天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
6天前
|
运维 网络协议 Linux
2023年河南省中等职业教育技能大赛网络建设与运维项目比赛试题(一)
2023年河南省中等职业教育技能大赛网络建设与运维项目比赛试题(一)
|
6天前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)
|
6天前
|
存储 网络协议 Shell
第十章 Shell编程时常用的系统文件
第十章 Shell编程时常用的系统文件
|
6天前
|
监控 Shell 开发工具
Shell编程
Shell编程
|
6天前
|
Shell
Shell脚本编程基础
Shell脚本编程基础
|
6天前
|
人工智能 机器人 Shell
【shell】shell数组的操作(定义、索引、长度、获取、删除、修改、拼接)
【shell】shell数组的操作(定义、索引、长度、获取、删除、修改、拼接)