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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【运维知识高级篇】超详细的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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
4天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
15 2
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Shell
Shell编程(下)
Shell编程(下)
88 1
|
1月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
40 1
|
1月前
|
Shell Linux 开发工具
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
65 12
|
1月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
49 2
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余