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

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

目录

if判断

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

Shell菜单

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

case流程判断

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

二、jumperserver跳板机

三、用case实现Nginx启动脚本

实战练习

一、批量创建删除用户

二、猜数字小游戏


if判断

第一种写法,then在表达式的后面,需要在表达式后面加分号
if [表达式成立];then
  执行的具体命令集合
fi

第二种写法,then在if下面,表达式后面不需要加分号
if [表达式成立]
then
  执行的具体命令集合
fi

语句1:

if [ 你有钱 ]
then
  我就嫁给你
fi

一个条件一个结果,成立则执行then后面的动作,不成立则无视
类似 [ 表达式成立 ] && echo 成立

语句2:

if [ 你有钱 ]
then
  我就嫁给你
else
  拜拜
fi

一个条件两个结果,成立则执行then后面的动作,不成立则执行else后面内容
类似 [ 表达式成立 ] && echo 成立 || echo 不成立

语句3:

if [ 你有钱 ]
then
  我就嫁给你
elif [ 你有房 ]
then
  我委屈点嫁给你
elif [ 你长得帅 ]       
then
  我们先做朋友
else
  啥也不是
fi

多个条件多个结果,成立则执行then后面的动作,不成立则执行else后面内容

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

[root@LB00 Day03]# cat os_install.sh
#!/bin/bash
#1、取系统版本号
os_ve=`hostnamectl|grep System|awk '{print $5}'`
mv_yum='mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup'
#2、判断网络是否正常
ping -c1 -W1 www.baidu.com &> /dev/null
if [ $? -ne 0 ];then
    echo "网络检查失败,正在重启网络..."
    systemctl restart network
    ping -c1 -W1 www.baidu.com &> /dev/null
    if [ $? -ne 0 ];then
        echo "网络重启完成,无法联网,请运维检查网络..."
        echo "网络重启完成,无法联网,请运维检查网络..." > /tmp/os_install.log
        mail -s '检查网络' [email protected] < /tmp/os_install.log
        exit
    fi
fi
#3、判断系统是否有安装wget命令
rpm -qa wget &> /dev/null
if [ $? -ne 0 ]
then 
    echo "wget命令未安装,正在安装中请稍后......"
    yum -y install wget &> /dev/null
    if [ $? -eq 0 ];then
        echo "wget安装成功..."
    else
        echo "wget安装失败,请手动测试..."
    fi
fi
#4、对比版本执行安装yum仓库
$mv_yum
if [ $os_ve -eq 7 ];then
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null
    if [ $? -eq 0 ];then
        echo "yum仓库配置完成"
    fi
elif [ $os_ve -eq 6 ];then
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo &> /dev/null
    if [ $? -eq 0 ];then
        echo "yum仓库配置完成"
    fi
elif [ $os_ve -eq 8 ];then
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo &> /dev/null
    if [ $? -eq 0 ];then
        echo "yum仓库配置完成"
    fi
else
    echo 这个版本的系统没有准备yum仓库的安装。
fi
[root@LB00 Day03]# sh os_install.sh
yum仓库配置完成
[root@LB00 Day03]# ip route del default
[root@LB00 Day03]# ip route add default via 10.0.0.3 dev eth0
[root@LB00 Day03]# sh os_install.sh
网络检查失败,正在重启网络...
yum仓库配置完成

Shell菜单

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

[root@LB00 Day03]# cat menu.sh
#!/bin/bash
cat<<EOF
			1.PHP5.4
			2.PHP5.5
			3.PHP7.1
EOF
echo -e "\t\t\t\033[31m 1.PHP5.4 \033[0m"
echo -e "\t\t\t\033[32m 2.PHP5.5 \033[0m"
echo -e "\t\t\t\033[33m 3.PHP7.1 \033[0m"
[root@LB00 Day03]# sh menu.sh
			1.PHP5.4
			2.PHP5.5
			3.PHP7.1
			 1.PHP5.4 
			 2.PHP5.5 
			 3.PHP7.1 

eca1e776119e4f6cb6724b950b7abd39.png

利用read与菜单交互

[root@LB00 Day03]# cat menu.sh
#!/bin/bash1
while true                    #死循环
do

echo -e "\t\t\t\033[31m 1.PHP5.4 \033[0m"
echo -e "\t\t\t\033[32m 2.PHP5.5 \033[0m"
echo -e "\t\t\t\033[33m 3.PHP7.1 \033[0m"
echo -e "\t\t\t\033[33m 4.exit \033[0m"
read -p "请输入你要安装的版本的编号: " num
if [ $num == 1 -o $num == "PHP5.4" ]
then
    echo "配置PHP5.4yum仓库..."
    echo "安装PHP5.4..."
elif [ $num == 2 -o $num == "PHP5.5" ]
then
    echo "配置PHP5.5yum仓库..."
    echo "安装PHP5.5..."
elif [ $num == 3 -o $num == "PHP7.1" ]
then
    echo "配置PHP7.1yum仓库..."
    echo "安装PHP7.1..."
elif [ $num == 4 -o $num == "exit" ]
then
    exit
else
    echo "输入信息有误"
fi

done
[root@LB00 Day03]# sh menu.sh
			 1.PHP5.4 
			 2.PHP5.5 
			 3.PHP7.1 
			 4.exit 
请输入你要安装的版本的编号: 1
配置PHP5.4yum仓库...
安装PHP5.4...
			 1.PHP5.4 
			 2.PHP5.5 
			 3.PHP7.1 
			 4.exit 
请输入你要安装的版本的编号: 2
配置PHP5.5yum仓库...
安装PHP5.5...
			 1.PHP5.4 
			 2.PHP5.5 
			 3.PHP7.1 
			 4.exit 
请输入你要安装的版本的编号: 4
[root@LB00 Day03]#

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

Tomcat Apache PHP Nginx

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

[root@LB00 Day03]# cat menu2.sh
#!/bin/bash1
while true
do

menu1(){
echo -e "\t\t\t\033[31m 1.PHP \033[0m"
echo -e "\t\t\t\033[32m 2.Tomcat \033[0m"
echo -e "\t\t\t\033[33m 3.Redis \033[0m"
echo -e "\t\t\t\033[34m 4.Mysql \033[0m"
echo -e "\t\t\t\033[35m 5.exit \033[0m"
echo -e "\t\t\t\033[36m h.显示菜单 \033[0m"
}
menu2(){
    echo -e "\t\t\t\033[31m 1.PHP5.4 \033[0m"
    echo -e "\t\t\t\033[31m 2.PHP5.5 \033[0m"
    echo -e "\t\t\t\033[31m 3.PHP7.1 \033[0m"
    echo -e "\t\t\t\033[31m 4.返回主菜单 \033[0m"
    echo -e "\t\t\t\033[31m 5.显示PHP菜单 \033[0m"
}
menu3(){
    echo -e "\t\t\t\033[32m 1.Tomcat7 \033[0m"
    echo -e "\t\t\t\033[32m 2.Tomcat8 \033[0m"
    echo -e "\t\t\t\033[32m 3.Tomcat9 \033[0m"
    echo -e "\t\t\t\033[32m 4.返回主菜单 \033[0m"
    echo -e "\t\t\t\033[32m 5.显示Tomcat菜单 \033[0m"
}
menu1
while true
do
read -p "请输入要安装的服务编号: " num1
if [ $num1 == 1 ]
then 
    menu2
    while true
    do
    read -p "请输入要安装的服务编号: " num_PHP
    if [ $num_PHP -eq 1 ]
    then
        echo "正在安装PHP5.4..."
    elif [ $num_PHP -eq 2 ]
    then
        echo "正在安装PHP5.5..."
    elif [ $num_PHP -eq 3 ]
    then
        echo "正在安装PHP7.1..."
    elif [ $num_PHP -eq 4 ]
    then
        break 2 #跳出2次循环
    elif [ $num_PHP -eq 5 ]
    then
        menu2
    fi
    done
elif [ $num1 == 2 ]
then
    menu3
    while true
    do
    read -p "请输入要安装的具体版本号: " num2
    if [ $num2 -eq 1 ]
    then
        echo "正在安装Tomcat7..."
    elif [ $num2 -eq 2 ]
    then
	echo "正在安装Tomcat8..."
    elif [ $num2 -eq 3 ]
    then
        echo "正在安装Tomcat9..."
    elif [ $num2 -eq 4 ]
    then
        break 2 #跳出两次循环
    elif [ $num2 -eq 5 ]
    then
	menu3
    fi
    done
elif [ $num1 == 3 ]
then
   echo 3
elif [ $num1 == 4 ]
then
   echo 4
elif [ $num1 == 5 ]
then
    exit
elif [ $num1 == h ]
then
    menu1
fi
done

done
[root@LB00 Day03]# sh menu2.sh
			 1.PHP 
			 2.Tomcat 
			 3.Redis 
			 4.Mysql 
			 5.exit 
			 h.显示菜单 
请输入要安装的服务编号: 1
			 1.PHP5.4 
			 2.PHP5.5 
			 3.PHP7.1 
			 4.返回主菜单 
			 5.显示PHP菜单 
请输入要安装的服务编号: 1
正在安装PHP5.4...
请输入要安装的服务编号: 1
正在安装PHP5.4...
请输入要安装的服务编号: 1
正在安装PHP5.4...
请输入要安装的服务编号: 1
正在安装PHP5.4...
请输入要安装的服务编号: 1
正在安装PHP5.4...
请输入要安装的服务编号: 5
			 1.PHP5.4 
			 2.PHP5.5 
			 3.PHP7.1 
			 4.返回主菜单 
			 5.显示PHP菜单 
请输入要安装的服务编号: 4
			 1.PHP 
			 2.Tomcat 
			 3.Redis 
			 4.Mysql 
			 5.exit 
			 h.显示菜单 
请输入要安装的服务编号: 2
			 1.Tomcat7 
			 2.Tomcat8 
			 3.Tomcat9 
			 4.返回主菜单 
			 5.显示Tomcat菜单 
请输入要安装的具体版本号: 2
正在安装Tomcat8...
请输入要安装的具体版本号: 2
正在安装Tomcat8...
请输入要安装的具体版本号: 2
正在安装Tomcat8...
请输入要安装的具体版本号: 5
			 1.Tomcat7 
			 2.Tomcat8 
			 3.Tomcat9 
			 4.返回主菜单 
			 5.显示Tomcat菜单 
请输入要安装的具体版本号: 4
			 1.PHP 
			 2.Tomcat 
			 3.Redis 
			 4.Mysql 
			 5.exit 
			 h.显示菜单 
请输入要安装的服务编号: 5

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

case流程判断

case 变量 in
    匹配序列1)
    执行命令
    ;;
    匹配序列2)
    执行命令
    ;;
    匹配序列3)
    执行命令
    ;;
    *)
    无匹配后续命令
esac

[root@LB00 Day03]# cat case.sh
#!/bin/bash
case $1 in
	mysql)
	echo mysql......
	;;
	shell)
	echo shell......
	;;
	docker)
	echo docker......
	;;
	*)
	echo "Usage: $0[mysql|shell|docker]"
esac
[root@LB00 Day03]# sh case.sh
Usage: case.sh[mysql|shell|docker]
[root@LB00 Day03]# sh case.sh mysql
mysql......
[root@LB00 Day03]# sh case.sh shell
shell......
[root@LB00 Day03]# sh case.sh docker
docker......

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

[root@LB00 Day03]# cat xitong.sh
#!/bin/bash
menu1(){
echo -e "\t\t\t\033[31m 1|f.显示内存 \033[0m"
echo -e "\t\t\t\033[32m 2|d.显示磁盘 \033[0m"
echo -e "\t\t\t\033[33m 3|u.显示负载 \033[0m"
echo -e "\t\t\t\033[34m 4|c.显示公网IP \033[0m"
echo -e "\t\t\t\033[35m 5|h.显示帮助 \033[0m"
echo -e "\t\t\t\033[36m 6|e.exit \033[0m"
}
menu1
while true
do
read -p "请输入你要查看系统信息的编号" num
case $num in
	1|f)
	free -h
	;;
	2|d)
	df -h
	;;
	3|u)
	uptime
	;;
	4|c)
	curl -s cip.cc |awk 'NR==1{print $3}'
	;;
	5|h)
	clear
	menu1
	;;
        6|e)
        exit
        ;;
	*)
	echo "Usage: $0 [1|2|3|4|5|6] [f|d|u|c|h|e]"
esac
done
[root@LB00 Day03]# sh xitong.sh
			 1|f.显示内存 
			 2|d.显示磁盘 
			 3|u.显示负载 
			 4|c.显示公网IP 
			 5|h.显示帮助 
			 6|e.exit 
请输入你要查看系统信息的编号1
              total        used        free      shared  buff/cache   available
Mem:           972M        148M        392M         13M        431M        670M
Swap:          1.0G          0B        1.0G
请输入你要查看系统信息的编号2
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M   14M  473M   3% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        19G  2.0G   17G  11% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs            98M     0   98M   0% /run/user/0
请输入你要查看系统信息的编号3
 15:22:53 up 1 day, 15:59,  3 users,  load average: 0.00, 0.01, 0.05
请输入你要查看系统信息的编号4
123.112.17.24
请输入你要查看系统信息的编号5
			 1|f.显示内存 
			 2|d.显示磁盘 
			 3|u.显示负载 
			 4|c.显示公网IP 
			 5|h.显示帮助 
			 6|e.exit 
请输入你要查看系统信息的编号h
			 1|f.显示内存 
			 2|d.显示磁盘 
			 3|u.显示负载 
			 4|c.显示公网IP 
			 5|h.显示帮助 
			 6|e.exit 
请输入你要查看系统信息的编号e

二、jumperserver跳板机

先做免密钥

[root@LB00 Day03]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:8oyhGevLUlZPstUAA43+bI1C/xvCEsbLEQEt2RdRheY root@LB00
The key's randomart image is:
+---[RSA 2048]----+
|  .=o+==.o.      |
|  o +.o.+        |
|   o.. o o       |
|   .o.o E .      |
|   .*=oOS        |
|   o+XB*o        |
|   oBo+.+        |
|  .o . ...       |
|   .+.  ..       |
+----[SHA256]-----+
[root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[root@LB00 Day03]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

基础功能

[root@LB00 Day03]# cat jumperserver.sh
#!/bin/bash
Web01=10.0.0.7
Web02=10.0.0.8
NFS=10.0.0.31
MySQL=10.0.0.51
Backup=10.0.0.41
menu(){
echo -e "\t\t\t\033[31m 1.Web01|$Web01 \033[0m"
echo -e "\t\t\t\033[32m 2.Web02|$Web02 \033[0m"
echo -e "\t\t\t\033[33m 3.NFS|$NFS \033[0m"
echo -e "\t\t\t\033[34m 4.MySQL|$MySQL \033[0m"
echo -e "\t\t\t\033[35m 5.Backup|$Backup \033[0m"
}
while true
do
menu
read -p "请输入要跳转的服务器编号: " num1
case $num1 in 
	1)
	ssh $Web01
	;;
	2)
        ssh $Web02
        ;;
        3)
        ssh $NFS
        ;;
        4)
        ssh $MySQL
        ;;
        5)
        ssh $Backup
        ;;
        *)
        echo "Usage: [1|2|3|4|5]"
        ;;
esac
done

#加入环境变量实现连接Xshell自动执行脚本,不允许进入命令行
[root@LB00 Day03]# tail -1 /etc/profile
sh /server/scripts/Day03/jumperserver.sh

			 1.Web01|10.0.0.7 
			 2.Web02|10.0.0.8 
			 3.NFS|10.0.0.31 
			 4.MySQL|10.0.0.51 
			 5.Backup|10.0.0.41 
请输入要跳转的服务器编号: 1
Last login: Tue May 16 15:41:54 2023 from 10.0.0.4
[root@Web01 ~]# exit
logout
Connection to 10.0.0.7 closed.
			 1.Web01|10.0.0.7 
			 2.Web02|10.0.0.8 
			 3.NFS|10.0.0.31 
			 4.MySQL|10.0.0.51 
			 5.Backup|10.0.0.41 
请输入要跳转的服务器编号: 

d68d100c5edc40c2b1e7b73516f3c8b6.png

jumperserver脚本简单完善

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

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

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

[root@LB00 Day03]# cat jumperserver.sh 
#!/bin/bash
trap "别乱按小心爆炸" INT #禁用ctrl+c
trap "别乱按小心爆炸" HUP #禁用停止进程,进程结束和初始化进程
trap "别乱按小心爆炸" TSTP #禁用ctrl+z
disable_ctrl_z () {
    echo "The Control-Z interrupt is disabled."
    read -p '是你吗' snm
    if [ "$snm" == yes ];then
        trap - INT
        trap - TSTP
        exit
    fi
}
trap disable_ctrl_z SIGTSTP
disable_ctrl_c () {
    echo "The Control-C interrupt is disabled."
}
trap disable_ctrl_c SIGINT

Web01=10.0.0.7
Web02=10.0.0.8
NFS=10.0.0.31
MySQL=10.0.0.51
Backup=10.0.0.41
password_neizhi_kaifa=666
mimashuru=false

menu1(){
echo -e "\t\t\t\033[31m 1.Web01|$Web01 \033[0m"
echo -e "\t\t\t\033[32m 2.Web02|$Web02 \033[0m"
echo -e "\t\t\t\033[33m 3.NFS|$NFS \033[0m"
echo -e "\t\t\t\033[34m 4.MySQL|$MySQL \033[0m"
echo -e "\t\t\t\033[35m 5.Backup|$Backup \033[0m"
}
menu2(){
echo -e "\t\t\t\033[31m 1.运维 \033[0m"
echo -e "\t\t\t\033[32m 2.开发 \033[0m"
echo -e "\t\t\t\033[33m 3.新员工注册身份 \033[0m"
}
while true
do
	menu2
	read -p "请输入您角色编号: " num2
	if [ "$num2" == 1 ];then
		while true
		do
		read -p "欢迎尊敬的运维工程师,请输入您的密码" password_yunwei  #-s隐藏输入内容
        echo ''    #-s会导致下一行格式出问题,所以在read使用-s后,下面紧跟空行解决
		if [ "$password_yunwei" != 123 ];then
		echo "密码输入错误,请重新输入"
		else
		mimashuru=true
		menu1
		break;
		fi
		done
	elif [ "$num2" == 2 ];then
	        while true
                do
		let i++
                read -s -p "欢迎尊敬的开发人员,请输入您的密码" password_kaifa  #-s隐藏输入内容
                echo ''   #-s会导致下一行格式出问题,所以在read使用-s后,下面紧跟空行解决
               		if [ "$password_kaifa" != "$password_neizhi_kaifa" ];then
                		echo "密码输入错误,请重新输入"
                	else
				mimashuru=true
                		menu1
                		break;
                	fi
		if [ "$i" -gt 4 ];then
			echo "输入密码错误次数过多,系统默认为您找回密码"
			read -p "请输入您注册时候的预留邮箱" youxiang
			case $youxiang in
				[email protected])
				echo 邮箱为:[email protected]
				;;
                                [email protected])
                                echo 邮箱为:[email protected]
                                ;;
                                [email protected])
                                echo 邮箱为:[email protected]
                                ;;
                                [email protected])
                                echo 邮箱为:[email protected]
                                ;;
                                *)
                                echo 这个邮箱里系统没有,你到底是不是我们公司的!
				break
                                ;;
			esac
			yzm="$((RANDOM%999999))"
			printf -v yzm "%06d" "$yzm" #不足6位数字,用6为填充
			echo 您正在进行xx公司跳板机密码找回业务,验证码为$yzm,如非本人操作请无视此邮箱,请不要把验证码告诉别人! > /tmp/yzm.log 
			mail -s '找回密码' $youxiang < /tmp/yzm.log &> /dev/null
			echo "已将6位随机验证码发送至您注册时的预留邮箱"	
			sleep 2
			read -p "请输入6位随机验证码" syzm
			if [ "$syzm" == $yzm ];then
			echo "密码输入正确,你密码给你重置成888了"
			password_neizhi_kaifa=888
			menu2
			else
			echo "这你都能输入错啊?"
			break
			fi	
		fi
                done
	elif [ "$num2" == 3 ];then
		echo '功能待开发'
	else 
		echo 'Usage: [1|2|3]'
	fi

	if [ $mimashuru == true ];then
	read -p "请输入要跳转的服务器编号: " num1
	case $num1 in 
		1)
		ssh $Web01
		;;
		2)
	        ssh $Web02
	        ;;
	        3)
	        ssh $NFS
	        ;;
	        4)
	        ssh $MySQL
	        ;;
	        5)
	        ssh $Backup
	        ;;
	        *)
	        echo "Usage: [1|2|3|4|5]"
	        ;;
	esac
	fi
done

[root@LB00 Day03]# sh jumperserver.sh    #测试密码功能,验证码发送邮箱功能
			 1.运维 
			 2.开发 
			 3.新员工注册身份 
请输入您角色编号: 2
欢迎尊敬的开发人员,请输入您的密码1
密码输入错误,请重新输入
欢迎尊敬的开发人员,请输入您的密码1
密码输入错误,请重新输入
欢迎尊敬的开发人员,请输入您的密码1
密码输入错误,请重新输入
欢迎尊敬的开发人员,请输入您的密码1
密码输入错误,请重新输入
欢迎尊敬的开发人员,请输入您的密码1
密码输入错误,请重新输入
输入密码错误次数过多,系统默认为您找回密码
  输入您注册时候的预留邮箱[email protected]
邮箱为:[email protected]
已将6位随机验证码发送至您注册时的预留邮箱
请输入6位随机验证码014565
密码输入正确,你密码给你重置成888了
			 1.运维 
			 2.开发 
			 3.新员工注册身份 
欢迎尊敬的开发人员,请输入您的密码    #隐藏
			 1.Web01|10.0.0.7 
			 2.Web02|10.0.0.8 
			 3.NFS|10.0.0.31 
			 4.MySQL|10.0.0.51 
			 5.Backup|10.0.0.41 
请输入要跳转的服务器编号: ^CThe Control-C interrupt is disabled.    #测试禁用ctrl+c,ctrl+z ,ctrl+z留了后门
^ZThe Control-Z interrupt is disabled.
是你吗yes

4cc7359a30c84d7b91eab203debc2bf1.png

三、用case实现Nginx启动脚本

基础功能

/usr/sbin/nginx                                             启动
/usr/sbin/nginx -s stop                                     停止
/usr/sbin/nginx -s reload                                   重新加载
/usr/sbin/nginx -s restart                                  不支持
/usr/sbin/nginx -s stop && sleep 1 && /usr/sbin/nginx       重启
/usr/sbin/nginx -s status                                   不支持
Nginx_port=`netstat -tnulp|grep nginx |awk '{print $4}'`
echo "Nginx_port=$Nginx_port"                               查看状态

[root@LB00 Day03]# cat nginx.sh
#!/bin/bash
case $1 in 
	start)
	/usr/sbin/nginx
	;;
	stop)
	/usr/sbin/nginx -s stop
	;;
	reload)
	/usr/sbin/nginx -s reload
	;;
	restart)
	/usr/sbin/nginx -s stop && sleep 1 && /usr/sbin/nginx
	;;
	status)
	Nginx_port=`netstat -tnulp|grep nginx |awk '{print $4}'`
	echo "Nginx_port=$Nginx_port"
	;;
	*)
	echo "Usage: [start|stop|reload|restart|status]"
esac

完善版本

[root@LB00 Day03]# cat nginx.sh
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
Nginx='/usr/sbin/nginx'
test(){
        if [ $? -eq 0 ];then
        #echo "Nginx启动成功"
        action "Nginx $1 is " /bin/true
        else
        #echo "Nginx停止失败"
        action "Nginx $1 is " /bin/false
        fi
}
case $1 in 
	start)
	$Nginx
	test $1
	;;
	stop)
	$Nginx -s stop
	test $1
	;;
	reload)
	$Nginx -s reload
	test $1
	;;
	restart)
	$Nginx -s stop && sleep 1 && $Nginx
	test $1
	;;
	status)
	Nginx_port=`netstat -tnulp|grep nginx |awk '{print $4}'`
	echo "Nginx_port=$Nginx_port"
	;;
	*)
	echo "Usage: [start|stop|reload|restart|status]"
esac

实战练习

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

一、批量创建删除用户

1、批量创建用户

2、批量删除用户

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

[root@LB00 Day03]# cat yonghu.sh 
#!/bin/bash
read -p "请输入用户的前缀: " qianzhui
if ! [[ $qianzhui =~ ^[a-z] ]];then
	echo 请注意前缀输入格式 
	exit	
fi
read -p "请输入要操作的数量: " num1
if ! [[ $num1 =~ ^[0-9]+$ ]];then
        echo 请注意输入数量的格式
        exit
fi
echo 为您生成如下用户
for i1 in $(seq 1 $num1)
do
	echo $qianzhui$i1
done
read -p "您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]" caozuo
if [ $caozuo == y ];then
	for i2 in $(seq 1 $num1)
	do
        	useradd $qianzhui$i2
	done		
	echo "用户创建完毕"
elif [ $caozuo == d ];then
	for i3 in $(seq 1 $num1)
        do
                userdel -rf $qianzhui$i3
        done
	echo "用户删除完毕"
elif [ $caozuo == i ];then
        for i4 in $(seq 1 $num1)
        do
                id $qianzhui$i4
        done
        echo "用户查询完毕"
else 
	echo 请输入正确的内容[y|d|i]
fi
[root@LB00 Day03]# sh yonghu.sh 
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1
qwer2
qwer3
qwer4
qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]y
用户创建完毕
[root@LB00 Day03]# sh yonghu.sh 
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1
qwer2
qwer3
qwer4
qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]i
uid=1002(qwer1) gid=1002(qwer1) groups=1002(qwer1)
uid=1003(qwer2) gid=1003(qwer2) groups=1003(qwer2)
uid=1004(qwer3) gid=1004(qwer3) groups=1004(qwer3)
uid=1005(qwer4) gid=1005(qwer4) groups=1005(qwer4)
uid=1006(qwer5) gid=1006(qwer5) groups=1006(qwer5)
用户查询完毕
[root@LB00 Day03]# sh yonghu.sh 
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1
qwer2
qwer3
qwer4
qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]d
用户删除完毕
[root@LB00 Day03]# sh yonghu.sh 
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1
qwer2
qwer3
qwer4
qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]i
id: qwer1: no such user
id: qwer2: no such user
id: qwer3: no such user
id: qwer4: no such user
id: qwer5: no such user
用户查询完毕

二、猜数字小游戏

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

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

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

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

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

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

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

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

[root@LB00 Day03]# cat caishu.sh
#!/bin/bash
sy_ran=`echo $((RANDOM%100+1))`

chongzhi(){
read -p "请输入充值的金额[1|2|3..10RRMB]: " jine
echo "恭喜你获得"$jine"次抽奖机会"
if ! [[ $jine =~ ^[0-9]+$ ]];then
        echo 请输入数字
        exit
fi
}
chongzhi
while true
do
if [ $jine -gt 0 ];then
jine=`echo "$jine-1"|bc`

let i++
read -p "请输入你要猜的数字[1-100]" num
if [[ ! $num =~ ^[0-9]+$ ]];then
	echo 请输入数字
	exit
fi
if [ $num -gt $sy_ran ];then
	echo "你输入的大了"
elif [ $num -lt $sy_ran ];then
	echo "你输入的小了"
else 
	echo "恭喜你猜对了,奖励你猜对号码对应的RMB"
	echo "数额为: $sy_ran"
	echo "共猜了"$i"次"
        break
fi
else
  echo "没有摇奖机会了,你可以选择继续充值"
  chongzhi
fi
done
[root@LB00 Day03]# sh caishu.sh
请输入充值的金额[1|2|3..10RRMB]: 5
恭喜你获得5次抽奖机会
请输入你要猜的数字[1-100]45
你输入的小了
请输入你要猜的数字[1-100]87
你输入的大了
请输入你要猜的数字[1-100]67
你输入的大了
请输入你要猜的数字[1-100]57
你输入的小了
请输入你要猜的数字[1-100]60
你输入的大了
没有摇奖机会了,你可以选择继续充值
请输入充值的金额[1|2|3..10RRMB]: 5
恭喜你获得5次抽奖机会
请输入你要猜的数字[1-100]58
恭喜你猜对了,奖励你猜对号码对应的RMB
数额为: 58
共猜了6次

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

[root@LB00 Day03]# cat caishu.sh
#!/bin/bash
menu(){
echo -e "\t\t\t\033[31m 1.系统帮你猜 \033[0m"
echo -e "\t\t\t\033[32m 2.自己手动猜 \033[0m"
}
sy_ran=`echo $((RANDOM%100+1))`
da=100
xiao=1
num=0
chongzhi(){
read -p "请输入充值的金额[1|2|3..10RRMB]: " jine
echo "恭喜你获得"$jine"次抽奖机会"
if ! [[ $jine =~ ^[0-9]+$ ]];then
        echo 请输入数字
        exit
fi
}
chongzhi
menu
read -p "请您输入编号选择猜数方式[1|2]: " fangshi
if [ $fangshi == 1 ];then
	echo 您选择的是系统帮你猜,祝您好运!
	while true
        do
        if [ $jine -gt 0 ];then
        jine=`echo "$jine-1"|bc`

        let i++
		if [ $num == 0 ];then
		num=`echo $((RANDOM%100+1))`
		else
			if [ $shangci == da ];then
			da=`echo "$num-1"|bc`
			#echo $da $xiao
			num=`shuf -i $xiao-$da -n 1`
			else
			xiao=`echo "$num+1"|bc`
			#echo $da $xiao
			num=`shuf -i $xiao-$da -n 1`
		        fi
		fi
        	echo "系统帮你猜的数字是$num"
		sleep 1
        	if [[ ! $num =~ ^[0-9]+$ ]];then
        	        echo 请输入数字
        	        exit
        	fi
        	if [ $num -gt $sy_ran ];then
        	        echo "系统猜的数字大了"
			shangci=da
        	elif [ $num -lt $sy_ran ];then
        	        echo "系统猜的数字小了"
			shangci=xiao
        	else
        	        echo "恭喜你,系统帮你猜对了,奖励是猜对号码对应的RMB"
        	        echo "数额为: $sy_ran"
        	        echo "共猜了"$i"次"
        	        break
        	fi
        else
          echo "没有摇奖机会了,你可以选择继续充值"
          chongzhi
        fi
        done
else
	echo 您选择的是自己手动猜,祝您好运!
	while true
	do
	if [ $jine -gt 0 ];then
	jine=`echo "$jine-1"|bc`
	
	let i++
	read -p "请输入你要猜的数字[1-100]" num
	if [[ ! $num =~ ^[0-9]+$ ]];then
		echo 请输入数字
		exit
	fi
	if [ $num -gt $sy_ran ];then
		echo "你输入的大了"
	elif [ $num -lt $sy_ran ];then
		echo "你输入的小了"
	else 
		echo "恭喜你猜对了,奖励你猜对号码对应的RMB"
		echo "数额为: $sy_ran"
		echo "共猜了"$i"次"
	        break
	fi
	else
	  echo "没有摇奖机会了,你可以选择继续充值"
	  chongzhi
	fi
	done
fi
[root@LB00 Day03]# sh caishu.sh
请输入充值的金额[1|2|3..10RRMB]: 10
恭喜你获得10次抽奖机会
			 1.系统帮你猜 
			 2.自己手动猜 
请您输入编号选择猜数方式[1|2]: 1
您选择的是系统帮你猜,祝您好运!
系统帮你猜的数字是21
系统猜的数字小了
系统帮你猜的数字是95
系统猜的数字大了
系统帮你猜的数字是38
系统猜的数字大了
系统帮你猜的数字是22
系统猜的数字小了
系统帮你猜的数字是27
系统猜的数字小了
系统帮你猜的数字是37
系统猜的数字大了
系统帮你猜的数字是30
系统猜的数字大了
系统帮你猜的数字是29
恭喜你,系统帮你猜对了,奖励是猜对号码对应的RMB
数额为: 29
共猜了8次

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

猜你喜欢

转载自blog.csdn.net/qq_37510195/article/details/130697597