case
  TEZNKK3IfmPf 2023年11月13日 67 0

 

 

case其实和if很像,本质是一样的,只不过case更严格一些 ,case的主要应用场景在服务和脚本的启停,使用方法如下:

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

例1:

#!
#!/bin/bash
cat <<eof
****************
** 1. backup  **
** 2. copy    **
** 3. quit    **
****************
eof
	read -p "请输入你想操作的选项[1|2|3]: " re

if [ $re -eq 1 ] -o [ $re == "backup" ];then  #不能这么用,会出错,用case就不会出错
	echo "------BackupDone....."
elif [ $re -eq 2 ];then
	echo "------CopyDone....."
elif [ $re -eq 3 ];then
	echo "你选择了退出...."
	exit
else
	echo "注意点....."

fi

改进例1:

#!
#!/bin/bash
cat <<eof
****************
** 1. backup  **
** 2. copy    **
** 3. quit    **
****************
eof
	read -p "请输入你想操作的选项[1|2|3]: " re

case $re in

	1|backup|BACKUP)     #这么用没有问题
		echo "backup..."
		;;
	2)
		echo "Copy...."
		;;
	3)
		echo "quit" && exit
		;;

	*)
		echo "你注意点..."
		echo "USAGE: $0 {1|2|3}"
		exit
esac

rsync、sesync、tomcat这样的服务不能使用systemctl控制,我们这里通过rsync来举例子。

#!/usr/bin/bash
source /etc/init.d/functions
rs=$1

case $rs in
	start)
	    if [ ! -f /var/run/rsync.pid ];then
		touch /var/run/rsync.pid
		rsync --daemon
		action  "Rsync Starting...." /bin/true
	  else
		action "Rsync Service Running..." /bin/false
    	  fi
		;;

	stop)
	    if [ ! -f /var/run/rsync.pid ];then
		action "Rsync Service Stoppend...." /bin/false
	    else
		rm -f /var/run/rsync.pid
		pkill rsync
		action "Rsync Stopting....." /bin/true
	    fi 
		;;

	status)
	    if [ ! -f /var/run/rsync.pid ];then
		echo "Rsync Service Status InActive...."
    	    else
		Rsync_Status=$(ps aux|grep rsync|grep -v grep|grep -v pts|awk '{print $2}')
		echo "Rsync Service Status Active( "$Rsync_Status" )"
    	   fi 
		;;
	*)
		echo "USAGE: $0 {start|stop|status}"
		exit
esac

这个脚本有一个问题,问题就是脚本的名字里面不能包含rsync这样的关键字,在grep的会出问题,通过grep -v排除也不好用。

nginx

#!/usr/bin/bash
source /etc/init.d/functions

#加锁
Lock=/tmp/nginx.lock
if [ -f $Lock ];then
	echo "此脚本正在运行,请稍后....."
	exit 
fi
touch $Lock


rc=$1
case $rc in
	start)
		if [ -f /var/run/nginx.pid ];then
			sleep 10
			action "nginx服务已经启动...." /bin/false
         else
			/usr/sbin/nginx
			action "nginx服务启动成功..." /bin/true
		fi
		;;
	stop)
		if [ -f /var/run/nginx.pid ];then
			/usr/sbin/nginx -s stop
				if [ $? -eq 0 ];then
					action "nginx关闭成功..." /bin/true
				else
					action "nginx关闭失败..." /bin/false
				fi
		else
			action "nginx已经关闭...[error] open() /run/nginx.pid"  /bin/false
		fi
		;;
	reload)
		if [ -f /var/run/nginx.pid ];then
			/usr/sbin/nginx -t &>/dev/null
			if [ $? -eq 0 ];then
				/usr/sbin/nginx -s reload
				if [ $? -eq 0 ];then
					action "nginx重载成功..." /bin/true
				else
					action "nginx重载失败..." /bin/false	
				fi
			else
				/usr/sbin/nginx -t &>err.txt
				nginx_conf=$(awk -F "[: ]" 'NR==1{print $(NF-1)}' err.txt)
				nginx_line=$(awk -F "[: ]" 'NR==1{print $(NF)}' err.txt)
				/usr/sbin/nginx -t
				read -p "$nginx_conf 配置文件有错,在第 $nginx_line 行, 是否要需要进行配置修改 [y|n]: " re
				case $re in
					y|yes|YES)
						vim +${nginx_line} ${nginx_conf}
						;;
					n|no|NO)
						echo "你可以选择手动修改,再见!"
						;;
					*)
						echo "USAGE: $0 {y|n} "
				esac
				
			fi

		else
			action "nginx没有启动,无法完成重载"  /bin/false
		fi
		;;
	status)
		if [ -f /var/run/nginx.pid ];then
			nginx_pid=$(cat /var/run/nginx.pid)
			echo "nginx  ( $nginx_pid ) is running...."
		else
			echo "nginx is Not running...."
		fi
		;;
	
	*)
		echo "USAGE: $0 [ start | stop | reload | status ] "

esac

#解锁
rm -f $Lock

系统工具箱

cat <<-EOF
        ===================
        h 显示命令帮助    
        f 显示磁盘分区 
        d 显示磁盘挂载 
        m 查看内存使用 
        u 查看系统负载 
        q 退出程序
        =====================
EOF


read -p "请输入你需要做的操作: "   sys
case $sys in 
	f)
		df -h
		;;
	d)
		mount -a |less
		;;
	u)
		w
		;;
	q)
		exit
		;;
	*)
		echo "USAGE: $0 [ h | f | d | m | u | q ]"
esac

跳板机

引脚本需要提前将自己的root的公钥推送到其实主机root上去。

#!/usr/bin/bash
meminfo(){
cat <<-EOF
-------------------------------
|       1) db01-172.16.1.52     |
|       2) db02-172.16.1.53     |
|       3) db02-172.16.1.54     |
|       h) help                 |
---------------------------------
EOF
}

# 调用函数打印菜单
meminfo

# 控制不让输入ctrl+c,z
trap "" HUP INT TSTP

while true
do
	read -p "请输入你需要连接的主机序号[1|2|3|..]: " connection
	case $connection in
		1)
			ssh root@172.16.1.52
				;;
		2)
			ssh root@172.16.1.53
				;;
			
		3)
			ssh root@172.16.1.54
				;;
		h)
			clear
			meminfo
			;;
	    # 加一个后门
		exec)
			exit
			;;
		*)
			echo "USAGE: $0 输入连接的主机编号即可 [ 1 | 2 | 3 | ]"
	esac
done

​ trap "" HUP INT TSTP 的意思防止他按ctrl信号退出,但是存在一个问题,断开链接就退出去了,怎么办呢?把执行命令放到普通用户的家目录里面的./bashrc里面。

多级菜单

#!/usr/bin/bash

mem_option (){
cat <<-EOF
---------主菜单----------
|   1) 安装nginx         |
|   2) 安装php           |
|   3) 退出              |
--------------------------
EOF
} 

mem_install_nginx(){
cat <<-EOF
-----Installed Nginx -----
|   1) 安装nginx1.1      |
|   2) 安装nginx1.2      |
|   3) 安装nginx1.3      |
|   4) 返回上一页        |
--------------------------
EOF
}

mem_install_php(){
cat <<-EOF
--------------------------
|   1) 安装php5.5        |
|   2) 安装php5.6        |
|   3) 安装php7.0        |
|   4) 返回上一页        |
--------------------------
EOF
}
#----------------------------------------------------------------------

while true
do
	mem_option
	read -p "请输入主菜单需要选择的选项,使用方法[1|2|3]: " option
	case $option in 
		1)
			while true
			do
				clear
				mem_install_nginx
				read -p "请输入你要安装Nginx的Version: " nginx_install_option
				case $nginx_install_option in
					1)
						clear 
						echo "Installed Nginx Version 1.1 is Done....."
						sleep 1
						;;
					2)
						clear
						echo "Installed Nginx Version 1.2 is Done....."
						sleep 1
						;;
					3)
						clear
						echo "Installed Nginx Version 1.3 is Done....."
						sleep 1
						;;
					4)
						clear
						break
						;;
				esac
			done
						;;
		2)
			clear
			mem_install_php
			read -p "请输入你要选择的php Version: " php_install_option
			case $php_install_option in
				1)
					echo "Installed php Version 5.5 is Done....."
					;;
				2)
					echo "Installed php Version 5.6 is Done....."
					;;
				3)
					echo "Installed php Version 5.7 is Done....."
					;;
				4)
					clear
					;;
				*)
			esac
			;;
		3)
				exit
				;;
		*)
			echo "USAGE: [ 1 | 2 |3 ]"
	esac
done
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   12   0   0 linuxgrep
  TEZNKK3IfmPf   2023年11月14日   15   0   0 过滤grep
  TEZNKK3IfmPf   2023年11月14日   18   0   0 过滤grep
  TEZNKK3IfmPf   2023年11月14日   13   0   0 linuxgrep
  TEZNKK3IfmPf   2023年11月15日   18   0   0 linuxfindgrep
  TEZNKK3IfmPf   2023年11月14日   16   0   0 windows脚本
  TEZNKK3IfmPf   2023年11月13日   18   0   0 IDEAgrep
TEZNKK3IfmPf