【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)

本篇文章继续给大家介绍Shell编程,带大家领略Shell的魅力,由if判断引入,以此扩展Shell菜单,case流程判断。还准备了很多案例,包括猜数小游戏,批量创建用户等等,在案例中学习会事半功倍!


if判断

1. 第一种写法,then在表达式的后面,需要在表达式后面加分号
2. if [表达式成立];then
3.   执行的具体命令集合
4. fi
5. 
6. 第二种写法,then在if下面,表达式后面不需要加分号
7. if [表达式成立]
8. then
9.   执行的具体命令集合
10. fi
11. 
12. 语句1:
13. 
14. if [ 你有钱 ]
15. then
16.   我就嫁给你
17. fi
18. 
19. 一个条件一个结果,成立则执行then后面的动作,不成立则无视
20. 类似 [ 表达式成立 ] && echo 成立
21. 
22. 语句2:
23. 
24. if [ 你有钱 ]
25. then
26.   我就嫁给你
27. else
28.   拜拜
29. fi
30. 
31. 一个条件两个结果,成立则执行then后面的动作,不成立则执行else后面内容
32. 类似 [ 表达式成立 ] && echo 成立 || echo 不成立
33. 
34. 语句3:
35. 
36. if [ 你有钱 ]
37. then
38.   我就嫁给你
39. elif [ 你有房 ]
40. then
41.   我委屈点嫁给你
42. elif [ 你长得帅 ]       
43. then
44.   我们先做朋友
45. else
46.   啥也不是
47. fi
48. 
49. 多个条件多个结果,成立则执行then后面的动作,不成立则执行else后面内容

一、根据判断的操作系统的版本安装不同的yum仓库

1. [root@LB00 Day03]# cat os_install.sh
2. #!/bin/bash
3. #1、取系统版本号
4. os_ve=`hostnamectl|grep System|awk '{print $5}'`
5. mv_yum='mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup'
6. #2、判断网络是否正常
7. ping -c1 -W1 www.baidu.com &> /dev/null
8. if [ $? -ne 0 ];then
9.     echo "网络检查失败,正在重启网络..."
10.     systemctl restart network
11.     ping -c1 -W1 www.baidu.com &> /dev/null
12. if [ $? -ne 0 ];then
13.         echo "网络重启完成,无法联网,请运维检查网络..."
14.         echo "网络重启完成,无法联网,请运维检查网络..." > /tmp/os_install.log
15.         mail -s '检查网络' xxxxx@qq.com < /tmp/os_install.log
16. exit
17.     fi
18. fi
19. #3、判断系统是否有安装wget命令
20. rpm -qa wget &> /dev/null
21. if [ $? -ne 0 ]
22. then
23.     echo "wget命令未安装,正在安装中请稍后......"
24.     yum -y install wget &> /dev/null
25. if [ $? -eq 0 ];then
26.         echo "wget安装成功..."
27. else
28.         echo "wget安装失败,请手动测试..."
29.     fi
30. fi
31. #4、对比版本执行安装yum仓库
32. $mv_yum
33. if [ $os_ve -eq 7 ];then
34. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null
35. if [ $? -eq 0 ];then
36.         echo "yum仓库配置完成"
37.     fi
38. elif [ $os_ve -eq 6 ];then
39. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo &> /dev/null
40. if [ $? -eq 0 ];then
41.         echo "yum仓库配置完成"
42.     fi
43. elif [ $os_ve -eq 8 ];then
44. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo &> /dev/null
45. if [ $? -eq 0 ];then
46.         echo "yum仓库配置完成"
47.     fi
48. else
49.     echo 这个版本的系统没有准备yum仓库的安装。
50. fi
51. [root@LB00 Day03]# sh os_install.sh
52. yum仓库配置完成
53. [root@LB00 Day03]# ip route del default
54. [root@LB00 Day03]# ip route add default via 10.0.0.3 dev eth0
55. [root@LB00 Day03]# sh os_install.sh
56. 网络检查失败,正在重启网络...
57. yum仓库配置完成

Shell菜单

两种创建菜单方式,给菜单加颜色

1. [root@LB00 Day03]# cat menu.sh
2. #!/bin/bash
3. cat<<EOF
4.      1.PHP5.4
5.      2.PHP5.5
6.      3.PHP7.1
7. EOF
8. echo -e "\t\t\t\033[31m 1.PHP5.4 \033[0m"
9. echo -e "\t\t\t\033[32m 2.PHP5.5 \033[0m"
10. echo -e "\t\t\t\033[33m 3.PHP7.1 \033[0m"
11. [root@LB00 Day03]# sh menu.sh
12.       1.PHP5.4
13.       2.PHP5.5
14.       3.PHP7.1
15.        1.PHP5.4
16.        2.PHP5.5
17.        3.PHP7.1

利用read与菜单交互

1. [root@LB00 Day03]# cat menu.sh
2. #!/bin/bash1
3. while true                    #死循环
4. do
5. 
6. echo -e "\t\t\t\033[31m 1.PHP5.4 \033[0m"
7. echo -e "\t\t\t\033[32m 2.PHP5.5 \033[0m"
8. echo -e "\t\t\t\033[33m 3.PHP7.1 \033[0m"
9. echo -e "\t\t\t\033[33m 4.exit \033[0m"
10. read -p "请输入你要安装的版本的编号: " num
11. if [ $num == 1 -o $num == "PHP5.4" ]
12. then
13.     echo "配置PHP5.4yum仓库..."
14.     echo "安装PHP5.4..."
15. elif [ $num == 2 -o $num == "PHP5.5" ]
16. then
17.     echo "配置PHP5.5yum仓库..."
18.     echo "安装PHP5.5..."
19. elif [ $num == 3 -o $num == "PHP7.1" ]
20. then
21.     echo "配置PHP7.1yum仓库..."
22.     echo "安装PHP7.1..."
23. elif [ $num == 4 -o $num == "exit" ]
24. then
25. exit
26. else
27.     echo "输入信息有误"
28. fi
29. 
30. done
31. [root@LB00 Day03]# sh menu.sh
32.        1.PHP5.4
33.        2.PHP5.5
34.        3.PHP7.1
35.        4.exit
36. 请输入你要安装的版本的编号: 1
37. 配置PHP5.4yum仓库...
38. 安装PHP5.4...
39.        1.PHP5.4
40.        2.PHP5.5
41.        3.PHP7.1
42.        4.exit
43. 请输入你要安装的版本的编号: 2
44. 配置PHP5.5yum仓库...
45. 安装PHP5.5...
46.        1.PHP5.4
47.        2.PHP5.5
48.        3.PHP7.1
49.        4.exit
50. 请输入你要安装的版本的编号: 4
51. [root@LB00 Day03]#

一、安装不同的软件服务版本

Tomcat Apache PHP Nginx

二级菜单,循环套循环,函数调用

1. [root@LB00 Day03]# cat menu2.sh
2. #!/bin/bash1
3. while true
4. do
5. 
6. menu1(){
7. echo -e "\t\t\t\033[31m 1.PHP \033[0m"
8. echo -e "\t\t\t\033[32m 2.Tomcat \033[0m"
9. echo -e "\t\t\t\033[33m 3.Redis \033[0m"
10. echo -e "\t\t\t\033[34m 4.Mysql \033[0m"
11. echo -e "\t\t\t\033[35m 5.exit \033[0m"
12. echo -e "\t\t\t\033[36m h.显示菜单 \033[0m"
13. }
14. menu2(){
15.     echo -e "\t\t\t\033[31m 1.PHP5.4 \033[0m"
16.     echo -e "\t\t\t\033[31m 2.PHP5.5 \033[0m"
17.     echo -e "\t\t\t\033[31m 3.PHP7.1 \033[0m"
18.     echo -e "\t\t\t\033[31m 4.返回主菜单 \033[0m"
19.     echo -e "\t\t\t\033[31m 5.显示PHP菜单 \033[0m"
20. }
21. menu3(){
22.     echo -e "\t\t\t\033[32m 1.Tomcat7 \033[0m"
23.     echo -e "\t\t\t\033[32m 2.Tomcat8 \033[0m"
24.     echo -e "\t\t\t\033[32m 3.Tomcat9 \033[0m"
25.     echo -e "\t\t\t\033[32m 4.返回主菜单 \033[0m"
26.     echo -e "\t\t\t\033[32m 5.显示Tomcat菜单 \033[0m"
27. }
28. menu1
29. while true
30. do
31. read -p "请输入要安装的服务编号: " num1
32. if [ $num1 == 1 ]
33. then
34.     menu2
35.     while true
36.     do
37. read -p "请输入要安装的服务编号: " num_PHP
38. if [ $num_PHP -eq 1 ]
39. then
40.         echo "正在安装PHP5.4..."
41.     elif [ $num_PHP -eq 2 ]
42. then
43.         echo "正在安装PHP5.5..."
44.     elif [ $num_PHP -eq 3 ]
45. then
46.         echo "正在安装PHP7.1..."
47.     elif [ $num_PHP -eq 4 ]
48. then
49.         break 2 #跳出2次循环
50.     elif [ $num_PHP -eq 5 ]
51. then
52.         menu2
53.     fi
54.     done
55. elif [ $num1 == 2 ]
56. then
57.     menu3
58.     while true
59.     do
60. read -p "请输入要安装的具体版本号: " num2
61. if [ $num2 -eq 1 ]
62. then
63.         echo "正在安装Tomcat7..."
64.     elif [ $num2 -eq 2 ]
65. then
66.   echo "正在安装Tomcat8..."
67.     elif [ $num2 -eq 3 ]
68. then
69.         echo "正在安装Tomcat9..."
70.     elif [ $num2 -eq 4 ]
71. then
72.         break 2 #跳出两次循环
73.     elif [ $num2 -eq 5 ]
74. then
75.   menu3
76.     fi
77.     done
78. elif [ $num1 == 3 ]
79. then
80.    echo 3
81. elif [ $num1 == 4 ]
82. then
83.    echo 4
84. elif [ $num1 == 5 ]
85. then
86. exit
87. elif [ $num1 == h ]
88. then
89.     menu1
90. fi
91. done
92. 
93. done
94. [root@LB00 Day03]# sh menu2.sh
95.        1.PHP 
96.        2.Tomcat 
97.        3.Redis 
98.        4.Mysql 
99.        5.exit
100.       h.显示菜单 
101. 请输入要安装的服务编号: 1
102.       1.PHP5.4
103.       2.PHP5.5
104.       3.PHP7.1
105.       4.返回主菜单 
106.       5.显示PHP菜单 
107. 请输入要安装的服务编号: 1
108. 正在安装PHP5.4...
109. 请输入要安装的服务编号: 1
110. 正在安装PHP5.4...
111. 请输入要安装的服务编号: 1
112. 正在安装PHP5.4...
113. 请输入要安装的服务编号: 1
114. 正在安装PHP5.4...
115. 请输入要安装的服务编号: 1
116. 正在安装PHP5.4...
117. 请输入要安装的服务编号: 5
118.       1.PHP5.4
119.       2.PHP5.5
120.       3.PHP7.1
121.       4.返回主菜单 
122.       5.显示PHP菜单 
123. 请输入要安装的服务编号: 4
124.       1.PHP 
125.       2.Tomcat 
126.       3.Redis 
127.       4.Mysql 
128.       5.exit
129.       h.显示菜单 
130. 请输入要安装的服务编号: 2
131.       1.Tomcat7
132.       2.Tomcat8
133.       3.Tomcat9
134.       4.返回主菜单 
135.       5.显示Tomcat菜单 
136. 请输入要安装的具体版本号: 2
137. 正在安装Tomcat8...
138. 请输入要安装的具体版本号: 2
139. 正在安装Tomcat8...
140. 请输入要安装的具体版本号: 2
141. 正在安装Tomcat8...
142. 请输入要安装的具体版本号: 5
143.       1.Tomcat7
144.       2.Tomcat8
145.       3.Tomcat9
146.       4.返回主菜单 
147.       5.显示Tomcat菜单 
148. 请输入要安装的具体版本号: 4
149.       1.PHP 
150.       2.Tomcat 
151.       3.Redis 
152.       4.Mysql 
153.       5.exit
154.       h.显示菜单 
155. 请输入要安装的服务编号: 5

注意:if做匹配最好用==,这样字符串和整数都能匹配;break跳出循环注意需要跳几次,跳几次就在后面写几

case流程判断

1. case 变量 in
2.     匹配序列1)
3.     执行命令
4.     ;;
5.     匹配序列2)
6.     执行命令
7.     ;;
8.     匹配序列3)
9.     执行命令
10.     ;;
11.     *)
12.     无匹配后续命令
13. esac
14. 
15. [root@LB00 Day03]# cat case.sh
16. #!/bin/bash
17. case $1 in
18.   mysql)
19.   echo mysql......
20.   ;;
21.   shell)
22.   echo shell......
23.   ;;
24.   docker)
25.   echo docker......
26.   ;;
27.   *)
28.   echo "Usage: $0[mysql|shell|docker]"
29. esac
30. [root@LB00 Day03]# sh case.sh
31. Usage: case.sh[mysql|shell|docker]
32. [root@LB00 Day03]# sh case.sh mysql
33. mysql......
34. [root@LB00 Day03]# sh case.sh shell
35. shell......
36. [root@LB00 Day03]# sh case.sh docker
37. docker......

一、使用菜单查看内存、磁盘、负载、公网IP

1. [root@LB00 Day03]# cat xitong.sh
2. #!/bin/bash
3. menu1(){
4. echo -e "\t\t\t\033[31m 1|f.显示内存 \033[0m"
5. echo -e "\t\t\t\033[32m 2|d.显示磁盘 \033[0m"
6. echo -e "\t\t\t\033[33m 3|u.显示负载 \033[0m"
7. echo -e "\t\t\t\033[34m 4|c.显示公网IP \033[0m"
8. echo -e "\t\t\t\033[35m 5|h.显示帮助 \033[0m"
9. echo -e "\t\t\t\033[36m 6|e.exit \033[0m"
10. }
11. menu1
12. while true
13. do
14. read -p "请输入你要查看系统信息的编号" num
15. case $num in
16.   1|f)
17.   free -h
18.   ;;
19.   2|d)
20.   df -h
21.   ;;
22.   3|u)
23.   uptime
24.   ;;
25.   4|c)
26.   curl -s cip.cc |awk 'NR==1{print $3}'
27.   ;;
28.   5|h)
29.   clear
30.   menu1
31.   ;;
32. 6|e)
33. exit
34.         ;;
35.   *)
36.   echo "Usage: $0 [1|2|3|4|5|6] [f|d|u|c|h|e]"
37. esac
38. done
39. [root@LB00 Day03]# sh xitong.sh
40.        1|f.显示内存 
41.        2|d.显示磁盘 
42.        3|u.显示负载 
43.        4|c.显示公网IP 
44.        5|h.显示帮助 
45.        6|e.exit
46. 请输入你要查看系统信息的编号1
47.               total        used        free      shared  buff/cache   available
48. Mem:           972M        148M        392M         13M        431M        670M
49. Swap:          1.0G          0B        1.0G
50. 请输入你要查看系统信息的编号2
51. Filesystem      Size  Used Avail Use% Mounted on
52. devtmpfs        476M     0  476M   0% /dev
53. tmpfs           487M     0  487M   0% /dev/shm
54. tmpfs           487M   14M  473M   3% /run
55. tmpfs           487M     0  487M   0% /sys/fs/cgroup
56. /dev/sda3        19G  2.0G   17G  11% /
57. /dev/sda1       197M  110M   88M  56% /boot
58. tmpfs            98M     0   98M   0% /run/user/0
59. 请输入你要查看系统信息的编号3
60. 15:22:53 up 1 day, 15:59,  3 users,  load average: 0.00, 0.01, 0.05
61. 请输入你要查看系统信息的编号4
62. 123.112.17.24
63. 请输入你要查看系统信息的编号5
64.        1|f.显示内存 
65.        2|d.显示磁盘 
66.        3|u.显示负载 
67.        4|c.显示公网IP 
68.        5|h.显示帮助 
69.        6|e.exit
70. 请输入你要查看系统信息的编号h
71.        1|f.显示内存 
72.        2|d.显示磁盘 
73.        3|u.显示负载 
74.        4|c.显示公网IP 
75.        5|h.显示帮助 
76.        6|e.exit
77. 请输入你要查看系统信息的编号e

二、jumperserver跳板机

先做免密钥

1. [root@LB00 Day03]# ssh-keygen
2. Generating public/private rsa key pair.
3. Enter file in which to save the key (/root/.ssh/id_rsa): 
4. Enter passphrase (empty for no passphrase): 
5. Enter same passphrase again: 
6. Your identification has been saved in /root/.ssh/id_rsa.
7. Your public key has been saved in /root/.ssh/id_rsa.pub.
8. The key fingerprint is:
9. SHA256:8oyhGevLUlZPstUAA43+bI1C/xvCEsbLEQEt2RdRheY root@LB00
10. The key's randomart image is:
11. +---[RSA 2048]----+
12. |  .=o+==.o.      |
13. |  o +.o.+        |
14. |   o.. o o       |
15. |   .o.o E .      |
16. |   .*=oOS        |
17. |   o+XB*o        |
18. |   oBo+.+        |
19. |  .o . ...       |
20. |   .+.  ..       |
21. +----[SHA256]-----+
22. [root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.7
23. [root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.8
24. [root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.31
25. [root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.41
26. [root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.51

基础功能

1. [root@LB00 Day03]# cat jumperserver.sh
2. #!/bin/bash
3. Web01=10.0.0.7
4. Web02=10.0.0.8
5. NFS=10.0.0.31
6. MySQL=10.0.0.51
7. Backup=10.0.0.41
8. menu(){
9. echo -e "\t\t\t\033[31m 1.Web01|$Web01 \033[0m"
10. echo -e "\t\t\t\033[32m 2.Web02|$Web02 \033[0m"
11. echo -e "\t\t\t\033[33m 3.NFS|$NFS \033[0m"
12. echo -e "\t\t\t\033[34m 4.MySQL|$MySQL \033[0m"
13. echo -e "\t\t\t\033[35m 5.Backup|$Backup \033[0m"
14. }
15. while true
16. do
17. menu
18. read -p "请输入要跳转的服务器编号: " num1
19. case $num1 in
20.   1)
21.   ssh $Web01
22.   ;;
23.   2)
24.         ssh $Web02
25.         ;;
26. 3)
27.         ssh $NFS
28.         ;;
29. 4)
30.         ssh $MySQL
31.         ;;
32. 5)
33.         ssh $Backup
34.         ;;
35. *)
36.         echo "Usage: [1|2|3|4|5]"
37.         ;;
38. esac
39. done
40. 
41. #加入环境变量实现连接Xshell自动执行脚本,不允许进入命令行
42. [root@LB00 Day03]# tail -1 /etc/profile
43. sh /server/scripts/Day03/jumperserver.sh
44. 
45.        1.Web01|10.0.0.7
46.        2.Web02|10.0.0.8
47.        3.NFS|10.0.0.31
48.        4.MySQL|10.0.0.51
49.        5.Backup|10.0.0.41
50. 请输入要跳转的服务器编号: 1
51. Last login: Tue May 16 15:41:54 2023 from 10.0.0.4
52. [root@Web01 ~]# exit
53. logout
54. Connection to 10.0.0.7 closed.
55.        1.Web01|10.0.0.7
56.        2.Web02|10.0.0.8
57.        3.NFS|10.0.0.31
58.        4.MySQL|10.0.0.51
59.        5.Backup|10.0.0.41
60. 请输入要跳转的服务器编号:

jumperserver脚本简单完善

1、权限控制,区分运维和开发的菜单,主菜单:1、运维;2、开发

2、添加密码,增加5次输错修改密码功能

3、只有运维能退出(留后门,其他角色都不能ctrl+c)

1. [root@LB00 Day03]# cat jumperserver.sh 
2. #!/bin/bash
3. trap "别乱按小心爆炸" INT #禁用ctrl+c
4. trap "别乱按小心爆炸" HUP #禁用停止进程,进程结束和初始化进程
5. trap "别乱按小心爆炸" TSTP #禁用ctrl+z
6. disable_ctrl_z () {
7.     echo "The Control-Z interrupt is disabled."
8. read -p '是你吗' snm
9. if [ "$snm" == yes ];then
10.         trap - INT
11.         trap - TSTP
12. exit
13.     fi
14. }
15. trap disable_ctrl_z SIGTSTP
16. disable_ctrl_c () {
17.     echo "The Control-C interrupt is disabled."
18. }
19. trap disable_ctrl_c SIGINT
20. 
21. Web01=10.0.0.7
22. Web02=10.0.0.8
23. NFS=10.0.0.31
24. MySQL=10.0.0.51
25. Backup=10.0.0.41
26. password_neizhi_kaifa=666
27. mimashuru=false
28. 
29. menu1(){
30. echo -e "\t\t\t\033[31m 1.Web01|$Web01 \033[0m"
31. echo -e "\t\t\t\033[32m 2.Web02|$Web02 \033[0m"
32. echo -e "\t\t\t\033[33m 3.NFS|$NFS \033[0m"
33. echo -e "\t\t\t\033[34m 4.MySQL|$MySQL \033[0m"
34. echo -e "\t\t\t\033[35m 5.Backup|$Backup \033[0m"
35. }
36. menu2(){
37. echo -e "\t\t\t\033[31m 1.运维 \033[0m"
38. echo -e "\t\t\t\033[32m 2.开发 \033[0m"
39. echo -e "\t\t\t\033[33m 3.新员工注册身份 \033[0m"
40. }
41. while true
42. do
43.   menu2
44.   read -p "请输入您角色编号: " num2
45.   if [ "$num2" == 1 ];then
46.     while true
47.     do
48.     read -p "欢迎尊敬的运维工程师,请输入您的密码" password_yunwei  #-s隐藏输入内容
49.         echo ''    #-s会导致下一行格式出问题,所以在read使用-s后,下面紧跟空行解决
50.     if [ "$password_yunwei" != 123 ];then
51.     echo "密码输入错误,请重新输入"
52.     else
53.     mimashuru=true
54.     menu1
55.     break;
56.     fi
57.     done
58.   elif [ "$num2" == 2 ];then
59.           while true
60.                 do
61.     let i++
62. read -s -p "欢迎尊敬的开发人员,请输入您的密码" password_kaifa  #-s隐藏输入内容
63.                 echo ''   #-s会导致下一行格式出问题,所以在read使用-s后,下面紧跟空行解决
64.     if [ "$password_kaifa" != "$password_neizhi_kaifa" ];then
65.                     echo "密码输入错误,请重新输入"
66.   else
67.         mimashuru=true
68.                     menu1
69.                     break;
70.                   fi
71.     if [ "$i" -gt 4 ];then
72.       echo "输入密码错误次数过多,系统默认为您找回密码"
73.       read -p "请输入您注册时候的预留邮箱" youxiang
74.       case $youxiang in
75.         apple@qq.com)
76.         echo 邮箱为:apple@qq.com
77.         ;;
78.                                 banana@qq.com)
79.                                 echo 邮箱为:banana@qq.com
80.                                 ;;
81.                                 orange@qq.com)
82.                                 echo 邮箱为:orange@qq.com
83.                                 ;;
84. 666@qq.com)
85.                                 echo 邮箱为:666@qq.com
86.                                 ;;
87. *)
88.                                 echo 这个邮箱里系统没有,你到底是不是我们公司的!
89.         break
90.                                 ;;
91.       esac
92.       yzm="$((RANDOM%999999))"
93.       printf -v yzm "%06d" "$yzm" #不足6位数字,用6为填充
94.       echo 您正在进行xx公司跳板机密码找回业务,验证码为$yzm,如非本人操作请无视此邮箱,请不要把验证码告诉别人! > /tmp/yzm.log 
95.       mail -s '找回密码' $youxiang < /tmp/yzm.log &> /dev/null
96.       echo "已将6位随机验证码发送至您注册时的预留邮箱"  
97.       sleep 2
98.       read -p "请输入6位随机验证码" syzm
99.       if [ "$syzm" == $yzm ];then
100.      echo "密码输入正确,你密码给你重置成888了"
101.      password_neizhi_kaifa=888
102.      menu2
103.      else
104.      echo "这你都能输入错啊?"
105.      break
106.      fi  
107.    fi
108.                 done
109.  elif [ "$num2" == 3 ];then
110.    echo '功能待开发'
111.  else
112.    echo 'Usage: [1|2|3]'
113.  fi
114. 
115.  if [ $mimashuru == true ];then
116.  read -p "请输入要跳转的服务器编号: " num1
117.  case $num1 in
118.    1)
119.    ssh $Web01
120.    ;;
121.    2)
122.          ssh $Web02
123.          ;;
124.          3)
125.          ssh $NFS
126.          ;;
127.          4)
128.          ssh $MySQL
129.          ;;
130.          5)
131.          ssh $Backup
132.          ;;
133.          *)
134.          echo "Usage: [1|2|3|4|5]"
135.          ;;
136.  esac
137.  fi
138. done
139. 
140. [root@LB00 Day03]# sh jumperserver.sh    #测试密码功能,验证码发送邮箱功能
141.       1.运维 
142.       2.开发 
143.       3.新员工注册身份 
144. 请输入您角色编号: 2
145. 欢迎尊敬的开发人员,请输入您的密码1
146. 密码输入错误,请重新输入
147. 欢迎尊敬的开发人员,请输入您的密码1
148. 密码输入错误,请重新输入
149. 欢迎尊敬的开发人员,请输入您的密码1
150. 密码输入错误,请重新输入
151. 欢迎尊敬的开发人员,请输入您的密码1
152. 密码输入错误,请重新输入
153. 欢迎尊敬的开发人员,请输入您的密码1
154. 密码输入错误,请重新输入
155. 输入密码错误次数过多,系统默认为您找回密码
156.   输入您注册时候的预留邮箱666@qq.com
157. 邮箱为:666@qq.com
158. 已将6位随机验证码发送至您注册时的预留邮箱
159. 请输入6位随机验证码014565
160. 密码输入正确,你密码给你重置成888了
161.       1.运维 
162.       2.开发 
163.       3.新员工注册身份 
164. 欢迎尊敬的开发人员,请输入您的密码    #隐藏
165.       1.Web01|10.0.0.7
166.       2.Web02|10.0.0.8
167.       3.NFS|10.0.0.31
168.       4.MySQL|10.0.0.51
169.       5.Backup|10.0.0.41
170. 请输入要跳转的服务器编号: ^CThe Control-C interrupt is disabled.    #测试禁用ctrl+c,ctrl+z ,ctrl+z留了后门
171. ^ZThe Control-Z interrupt is disabled.
172. 是你吗yes

三、用case实现Nginx启动脚本

基础功能

1. /usr/sbin/nginx                                             启动
2. /usr/sbin/nginx -s stop                                     停止
3. /usr/sbin/nginx -s reload                                   重新加载
4. /usr/sbin/nginx -s restart                                  不支持
5. /usr/sbin/nginx -s stop && sleep 1 && /usr/sbin/nginx       重启
6. /usr/sbin/nginx -s status                                   不支持
7. Nginx_port=`netstat -tnulp|grep nginx |awk '{print $4}'`
8. echo "Nginx_port=$Nginx_port"                               查看状态
9. 
10. [root@LB00 Day03]# cat nginx.sh
11. #!/bin/bash
12. case $1 in
13.   start)
14.   /usr/sbin/nginx
15.   ;;
16.   stop)
17.   /usr/sbin/nginx -s stop
18.   ;;
19.   reload)
20.   /usr/sbin/nginx -s reload
21.   ;;
22.   restart)
23.   /usr/sbin/nginx -s stop && sleep 1 && /usr/sbin/nginx
24.   ;;
25.   status)
26.   Nginx_port=`netstat -tnulp|grep nginx |awk '{print $4}'`
27.   echo "Nginx_port=$Nginx_port"
28.   ;;
29.   *)
30.   echo "Usage: [start|stop|reload|restart|status]"
31. esac

完善版本

1. [root@LB00 Day03]# cat nginx.sh
2. #!/bin/bash
3. [ -f /etc/init.d/functions ] && . /etc/init.d/functions
4. Nginx='/usr/sbin/nginx'
5. test(){
6. if [ $? -eq 0 ];then
7.         #echo "Nginx启动成功"
8.         action "Nginx $1 is " /bin/true
9. else
10.         #echo "Nginx停止失败"
11.         action "Nginx $1 is " /bin/false
12.         fi
13. }
14. case $1 in
15.   start)
16.   $Nginx
17.   test $1
18.   ;;
19.   stop)
20.   $Nginx -s stop
21.   test $1
22.   ;;
23.   reload)
24.   $Nginx -s reload
25.   test $1
26.   ;;
27.   restart)
28.   $Nginx -s stop && sleep 1 && $Nginx
29.   test $1
30.   ;;
31.   status)
32.   Nginx_port=`netstat -tnulp|grep nginx |awk '{print $4}'`
33.   echo "Nginx_port=$Nginx_port"
34.   ;;
35.   *)
36.   echo "Usage: [start|stop|reload|restart|status]"
37. esac

实战练习

进行一些实战练习,使学习达到事半功倍的效果。

一、批量创建删除用户

1、批量创建用户

2、批量删除用户

read读入变量用户的前缀和个数,使用for循环,显示出需要创建的用户,提示创建还是删除以上用户,y创建,d删除,i查看用户id,结果需要提示

1. [root@LB00 Day03]# cat yonghu.sh 
2. #!/bin/bash
3. read -p "请输入用户的前缀: " qianzhui
4. if ! [[ $qianzhui =~ ^[a-z] ]];then
5.  echo 请注意前缀输入格式 
6.  exit  
7. fi
8. read -p "请输入要操作的数量: " num1
9. if ! [[ $num1 =~ ^[0-9]+$ ]];then
10.         echo 请注意输入数量的格式
11. exit
12. fi
13. echo 为您生成如下用户
14. for i1 in $(seq 1 $num1)
15. do
16.   echo $qianzhui$i1
17. done
18. read -p "您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]" caozuo
19. if [ $caozuo == y ];then
20.   for i2 in $(seq 1 $num1)
21.   do
22.           useradd $qianzhui$i2
23.   done    
24.   echo "用户创建完毕"
25. elif [ $caozuo == d ];then
26.   for i3 in $(seq 1 $num1)
27.         do
28.                 userdel -rf $qianzhui$i3
29.         done
30.   echo "用户删除完毕"
31. elif [ $caozuo == i ];then
32. for i4 in $(seq 1 $num1)
33.         do
34.                 id $qianzhui$i4
35.         done
36.         echo "用户查询完毕"
37. else
38.   echo 请输入正确的内容[y|d|i]
39. fi
40. [root@LB00 Day03]# sh yonghu.sh 
41. 请输入用户的前缀: qwer
42. 请输入要操作的数量: 5
43. 为您生成如下用户
44. qwer1
45. qwer2
46. qwer3
47. qwer4
48. qwer5
49. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]y
50. 用户创建完毕
51. [root@LB00 Day03]# sh yonghu.sh 
52. 请输入用户的前缀: qwer
53. 请输入要操作的数量: 5
54. 为您生成如下用户
55. qwer1
56. qwer2
57. qwer3
58. qwer4
59. qwer5
60. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]i
61. uid=1002(qwer1) gid=1002(qwer1) groups=1002(qwer1)
62. uid=1003(qwer2) gid=1003(qwer2) groups=1003(qwer2)
63. uid=1004(qwer3) gid=1004(qwer3) groups=1004(qwer3)
64. uid=1005(qwer4) gid=1005(qwer4) groups=1005(qwer4)
65. uid=1006(qwer5) gid=1006(qwer5) groups=1006(qwer5)
66. 用户查询完毕
67. [root@LB00 Day03]# sh yonghu.sh 
68. 请输入用户的前缀: qwer
69. 请输入要操作的数量: 5
70. 为您生成如下用户
71. qwer1
72. qwer2
73. qwer3
74. qwer4
75. qwer5
76. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]d
77. 用户删除完毕
78. [root@LB00 Day03]# sh yonghu.sh 
79. 请输入用户的前缀: qwer
80. 请输入要操作的数量: 5
81. 为您生成如下用户
82. qwer1
83. qwer2
84. qwer3
85. qwer4
86. qwer5
87. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]i
88. id: qwer1: no such user
89. id: qwer2: no such user
90. id: qwer3: no such user
91. id: qwer4: no such user
92. id: qwer5: no such user
93. 用户查询完毕

二、猜数字小游戏

1、系统随机生成1-100之间的数字

1. echo $RANDOM 默认1-32767
2. echo $((RANDOM%100))    0-99
3. echo $((RANDOM%100+1))    1-100

2、read让用户输入1-100之间的一个数字

如果小于随机的,则提示用户大了

如果小于随机的,则提示用户小了

3、没猜对一直猜,猜对了提示成功,退出脚本

1. [root@LB00 Day03]cat caishu.sh
2. #!/bin/bash
3. sy_ran=`echo $((RANDOM%100+1))`
4. while true
5. do
6. read -p "请输入你要猜的数字[1-100]" num
7. if [ $num -gt $sy_ran ];then
8.  echo "你输入的大了"
9. elif [ $num -lt $sy_ran ];then
10.   echo "你输入的小了"
11. else
12.   echo "恭喜你猜对了,奖励你猜对号码对应的RMB"
13.   echo "数额为: $sy_ran"
14. break
15. fi
16. done

可以再完善个冲金额功能和次数功能

1. [root@LB00 Day03]# cat caishu.sh
2. #!/bin/bash
3. sy_ran=`echo $((RANDOM%100+1))`
4. 
5. chongzhi(){
6. read -p "请输入充值的金额[1|2|3..10RRMB]: " jine
7. echo "恭喜你获得"$jine"次抽奖机会"
8. if ! [[ $jine =~ ^[0-9]+$ ]];then
9.         echo 请输入数字
10. exit
11. fi
12. }
13. chongzhi
14. while true
15. do
16. if [ $jine -gt 0 ];then
17. jine=`echo "$jine-1"|bc`
18. 
19. let i++
20. read -p "请输入你要猜的数字[1-100]" num
21. if [[ ! $num =~ ^[0-9]+$ ]];then
22.   echo 请输入数字
23.   exit
24. fi
25. if [ $num -gt $sy_ran ];then
26.   echo "你输入的大了"
27. elif [ $num -lt $sy_ran ];then
28.   echo "你输入的小了"
29. else
30.   echo "恭喜你猜对了,奖励你猜对号码对应的RMB"
31.   echo "数额为: $sy_ran"
32.   echo "共猜了"$i"次"
33.         break
34. fi
35. else
36.   echo "没有摇奖机会了,你可以选择继续充值"
37.   chongzhi
38. fi
39. done
40. [root@LB00 Day03]# sh caishu.sh
41. 请输入充值的金额[1|2|3..10RRMB]: 5
42. 恭喜你获得5次抽奖机会
43. 请输入你要猜的数字[1-100]45
44. 你输入的小了
45. 请输入你要猜的数字[1-100]87
46. 你输入的大了
47. 请输入你要猜的数字[1-100]67
48. 你输入的大了
49. 请输入你要猜的数字[1-100]57
50. 你输入的小了
51. 请输入你要猜的数字[1-100]60
52. 你输入的大了
53. 没有摇奖机会了,你可以选择继续充值
54. 请输入充值的金额[1|2|3..10RRMB]: 5
55. 恭喜你获得5次抽奖机会
56. 请输入你要猜的数字[1-100]58
57. 恭喜你猜对了,奖励你猜对号码对应的RMB
58. 数额为: 58
59. 共猜了6次

可以再扩展下,让系统自己猜

1. [root@LB00 Day03]# cat caishu.sh
2. #!/bin/bash
3. menu(){
4. echo -e "\t\t\t\033[31m 1.系统帮你猜 \033[0m"
5. echo -e "\t\t\t\033[32m 2.自己手动猜 \033[0m"
6. }
7. sy_ran=`echo $((RANDOM%100+1))`
8. da=100
9. xiao=1
10. num=0
11. chongzhi(){
12. read -p "请输入充值的金额[1|2|3..10RRMB]: " jine
13. echo "恭喜你获得"$jine"次抽奖机会"
14. if ! [[ $jine =~ ^[0-9]+$ ]];then
15.         echo 请输入数字
16. exit
17. fi
18. }
19. chongzhi
20. menu
21. read -p "请您输入编号选择猜数方式[1|2]: " fangshi
22. if [ $fangshi == 1 ];then
23.   echo 您选择的是系统帮你猜,祝您好运!
24.   while true
25.         do
26. if [ $jine -gt 0 ];then
27.         jine=`echo "$jine-1"|bc`
28. 
29.         let i++
30.     if [ $num == 0 ];then
31.     num=`echo $((RANDOM%100+1))`
32.     else
33.       if [ $shangci == da ];then
34.       da=`echo "$num-1"|bc`
35.       #echo $da $xiao
36.       num=`shuf -i $xiao-$da -n 1`
37.       else
38.       xiao=`echo "$num+1"|bc`
39.       #echo $da $xiao
40.       num=`shuf -i $xiao-$da -n 1`
41.             fi
42.     fi
43.           echo "系统帮你猜的数字是$num"
44.     sleep 1
45.   if [[ ! $num =~ ^[0-9]+$ ]];then
46.                   echo 请输入数字
47.           exit
48.           fi
49.   if [ $num -gt $sy_ran ];then
50.                   echo "系统猜的数字大了"
51.       shangci=da
52.           elif [ $num -lt $sy_ran ];then
53.                   echo "系统猜的数字小了"
54.       shangci=xiao
55.   else
56.                   echo "恭喜你,系统帮你猜对了,奖励是猜对号码对应的RMB"
57.                   echo "数额为: $sy_ran"
58.                   echo "共猜了"$i"次"
59.                   break
60.           fi
61. else
62.           echo "没有摇奖机会了,你可以选择继续充值"
63.           chongzhi
64.         fi
65.         done
66. else
67.   echo 您选择的是自己手动猜,祝您好运!
68.   while true
69.   do
70.   if [ $jine -gt 0 ];then
71.   jine=`echo "$jine-1"|bc`
72. 
73.   let i++
74.   read -p "请输入你要猜的数字[1-100]" num
75.   if [[ ! $num =~ ^[0-9]+$ ]];then
76.     echo 请输入数字
77.     exit
78.   fi
79.   if [ $num -gt $sy_ran ];then
80.     echo "你输入的大了"
81.   elif [ $num -lt $sy_ran ];then
82.     echo "你输入的小了"
83.   else
84.     echo "恭喜你猜对了,奖励你猜对号码对应的RMB"
85.     echo "数额为: $sy_ran"
86.     echo "共猜了"$i"次"
87.           break
88.   fi
89.   else
90.     echo "没有摇奖机会了,你可以选择继续充值"
91.     chongzhi
92.   fi
93.   done
94. fi
95. [root@LB00 Day03]# sh caishu.sh
96. 请输入充值的金额[1|2|3..10RRMB]: 10
97. 恭喜你获得10次抽奖机会
98.        1.系统帮你猜 
99.        2.自己手动猜 
100. 请您输入编号选择猜数方式[1|2]: 1
101. 您选择的是系统帮你猜,祝您好运!
102. 系统帮你猜的数字是21
103. 系统猜的数字小了
104. 系统帮你猜的数字是95
105. 系统猜的数字大了
106. 系统帮你猜的数字是38
107. 系统猜的数字大了
108. 系统帮你猜的数字是22
109. 系统猜的数字小了
110. 系统帮你猜的数字是27
111. 系统猜的数字小了
112. 系统帮你猜的数字是37
113. 系统猜的数字大了
114. 系统帮你猜的数字是30
115. 系统猜的数字大了
116. 系统帮你猜的数字是29
117. 恭喜你,系统帮你猜对了,奖励是猜对号码对应的RMB
118. 数额为: 29
119. 共猜了8次

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
Shell
在Shell脚本中的if语句
在Shell脚本中的if语句
46 1
|
6月前
|
运维 Shell C语言
运维(20)- shell awk
运维(20)- shell awk
36 0
|
2天前
|
Shell
shell学习(六) 【case多条件分支语句】
shell学习(六) 【case多条件分支语句】
19 1
|
2天前
|
存储 Shell Linux
【Shell 命令集合 系统管理 】Linux 删除用户 userdel 命令 使用指南
【Shell 命令集合 系统管理 】Linux 删除用户 userdel 命令 使用指南
78 2
|
6月前
|
运维 Shell 测试技术
运维(23)- shell自动化部署
运维(23)- shell自动化部署
45 0
|
2天前
|
Shell
Shell脚本中的`case`语句
Shell脚本中的`case`语句
35 5
|
2天前
|
Shell
在Shell脚本中,使用`if`语句进行复杂的条件判断
在Shell脚本中,使用`if`语句进行复杂的条件判断
41 2
|
2天前
|
存储 运维 Shell
Shell内置命令大全,Linux运维工程师收藏!
Shell内置命令大全,Linux运维工程师收藏!
174 0
Shell内置命令大全,Linux运维工程师收藏!
|
2天前
|
运维 Linux 网络安全
利用群晖NAS+shell脚本实现运维命令执行结果文件自动上传
利用群晖NAS+shell脚本实现运维命令执行结果文件自动上传
144 0
|
2天前
|
存储 Shell
Shell编程自动化之if、for、while和函数
本文主要介绍了Shell编程自动化之if、for、while和函数,并结合实例测试。
29 3