【linux 脚本篇】流程控制语句-case

news2025/1/11 20:45:49

目录

🍁案例一:菜单选项

🍂if语句执行

🍂case语句执行

🍁案例二:rsync服务脚本

🍂if语句执行

🍂case语句执行

🍁案例三:nginx服务脚本

🍁案例四:实现系统工具箱

🍁案例五:实现简单的jumpserver跳板机


    🦐博客主页:大虾好吃吗的博客

    🦐专栏地址:Linux从入门到精通

        用来实现程序流程的选择、循环等进行控制,类似于if,但更具准确性,一般用于服务的启动、停止脚本。

语法格式如下:

case 变量 in
    变量1)
        命令序列1;;
    变量2)
        命令序列2;;
    变量3)
        命令序列3;;
esac

        这种语句,需要做大量的练习,下面来几个案例,其他的可以在网上搜。为了区分if和case的区别,下面案例使用两种语法实现。

案例一:菜单选项

        实现方法分别用if语句和case语句展示,先来看看if语句是怎么实现的吧。

if语句执行

        下面使用了多分支if语句,来判断123,但是这种语法不够精确。可以加入更多的正则表达式,来增加精确性,但是这样不太实用,我们的理念是用最少的语法命令,做更多更便捷的事。

[root@daxia ~]# vim if1.sh
#!/bin/bash
cat << EOF
=========+
1.backup |
2.copy   |
3.quit   |
=========+
EOF
read -p "请输入你的选项[1|2|3]:" as
​
if [ ${as} -eq 1 ];then
    echo "==backup=="
elif [ ${as} -eq 2 ];then
    echo "==copy=="
elif [ ${as} -eq 3 ];then
    echo "==quit=="
else
    echo "已退出;请输入[1|2|3]"
fi

执行脚本测试

[root@daxia ~]# sh if1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:1
==backup==
[root@daxia ~]# sh if1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:2
==copy==
[root@daxia ~]# sh if1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:3
==quit==
[root@daxia ~]# sh if1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:4
已退出;请输入[1|2|3]

case语句执行

#!/bin/bash
cat <<EOF
=========+
1.backup |
2.copy   |
3.quit   |
=========+
EOF
​
read -p "请输入你的选项[1|2|3]:" as
​
case ${as} in
    1)
    echo "==backup=="
    ;;
    2)
    echo "==copy=="
    ;;
    3)
    echo "==quit==" && exit
    ;;
    *)
    echo "警告!!!!"
    echo "执行${0}后,请输入 {1|2|3}"
    exit
esac
[root@daxia ~]# vim case1.sh
#!/bin/bash
cat <<EOF
=========+
1.backup |
2.copy   |
3.quit   |
=========+
EOF
​
read -p "请输入你的选项[1|2|3]:" as
​
case ${as} in
    1)
    echo "==backup=="
    ;;
    2)
    echo "==copy=="
    ;;
    3)
    echo "==quit==" && exit
    ;;
    *)
    echo "!!!!大虾警告!!!!"
    echo "执行${0}后,请输入 {1|2|3}"
    exit
esac

执行脚本测试

[root@daxia ~]# sh case1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:1
==backup==
[root@daxia ~]# sh case1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:2
==copy==
[root@daxia ~]# sh case1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:3    
==quit==
[root@daxia ~]# sh case1.sh 
=========+
1.backup |
2.copy   |
3.quit   |
=========+
请输入你的选项[1|2|3]:4
!!!!大虾警告!!!!
执行case1.sh后,请输入 {1|2|3}

案例二:rsync服务脚本

        案例思路: rsync的启动命令: rsync --daemon rsync的停止命令: pkill rsync

if语句执行

[root@daxia ~]# vim if2.sh
#!/bin/bash
source /etc/init.d/functions
​
if [ $1 == "start" ];then
    rsync --daemon
    action "rsync starting..." /bin/true
elif [ $1 == "stop" ];then
    pkill rsync
    action "rsync stoping..." /bin/true
else
    echo "USAGE: $0 {start|stop}"
    exit 
fi 

执行脚本测试

[root@daxia ~]# sh if2.sh start
rsync starting...                                          [  确定  ]
[root@daxia ~]# sh if2.sh stop
rsync stoping...                                           [  确定  ]

case语句执行

[root@daxia ~]# vim case2.sh
#!/bin/bash
source /etc/init.d/functions
​
case $1 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)
     rm -f /var/run/rsync.pid
     pkill rsync
     action "rsync stopping..."/bin/true
    ;;
    status)
     if [ ! -f /var/run/rsync.pid ];then
      echo "rsync service status InActive.."
     else
      rsync_status=$(ps aux |grep -v grep | awk '{print $2}')
      echo "rsync service status Active("$rsync_status")"
     fi
    ;;
    *)
     echo "USAGE:$0{start|stop|status}"
     exit
esac

执行脚本测试

[root@daxia ~]# sh case2.sh start
rsync starting..                                           [  确定  ]
[root@daxia ~]# sh case2.sh status
rsync service status Active(PID 1 2 4 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 30 31 32 33 41 43 44 45 47 60 97 274 275 276 277 283 284 288 289 291 292 297 298 328 370 371 380 381 394 395 396 397 398 399 400 401 402 403 404 483 568 572 574 578 580 582 583 584 656 692 701 715 730 785 1211 1216 1315 1738 1742 1785 1789 2351 2608 20877 21461 21462 21498 21531 21571 21622 21673 21702 35033 49365 49824 49828 49895 50046 50050 50051 50057 50353 50354 50358 50449 50453 78262 78273 78357 78380 78393 78395 78400 78401 78403)
[root@daxia ~]# sh case2.sh stop
rsync stopping.../bin/true                                 [  确定  ]

案例三:nginx服务脚本

案例思路: 如何启动 /usr/sbin/nginx 如何停止 /usr/sbin/nginx -s stop 如何重载

[root@daxia ~]# vim case3.sh
#!/bin/bash
source /etc/init.d/functions
case $1 in
	start)
		if [ -f /var/run/nginx.pid ];then
			action "nginx服务已启动..." /bin/false
			exit
		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服务已经关闭..." /bin/false	
		fi
		;;
	reload)
		if [ -f /var/run/nginx.pid ];then
			/usr/sbin/nginx -s reload
			if [ $? -eq 0 ];then 
				action "nginx重载成功..." /bin/true
			else
				action "nginx重载失败..." /bin/false
			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|status}"
esac

执行脚本测试

[root@daxia ~]# sh case3.sh start
nginx服务启动成功...                                       [  确定  ]
[root@daxia ~]# sh case3.sh reload
nginx重载成功...                                           [  确定  ]
[root@daxia ~]# sh case3.sh status
nginx ( 98699 ) is running...
[root@daxia ~]# sh case3.sh stop
nginx服务关闭成功...                                       [  确定  ]

案例四:实现系统工具箱

[root@daxia ~]# vim case4.sh
#!/bin/bash
cat <<EOF
+++++++++++++++
h 显示命令帮助+
f 显示分区使用+
d 显示磁盘挂载+
m 查看内存使用+
u 查看cpu负载 +
q 退出	      +
+++++++++++++++
EOF

read -p "请输入你的选项:" SZ

case $SZ in 
	f)
		df -hT
		;;
	d)
		mount | more
		;;
	m)
		free -h
		;;
	u)
		uptime
		;;
	q)
		exit
		;;
	*)
		echo "USAGE: $0 【h|f|d|m|u|q】"
esac

案例五:实现简单的jumpserver跳板机

        案例思路: 需要看到所有能管理的主机 选择菜单,提示输入某个主机IP地址分为公有和私有地址 私有地址: A 10.0.0.0 -10.255.255.255 B 172.16.0.0 - 172.31.255.255 C 192.168.0.0 - 192.168.255.255

        配置前先配置互信和本地解析 通过秘钥访问(无密码)最安全。 在跳板机产生一对秘钥(公钥、私钥)采用方式:公钥加密,私钥解密,将公钥放到对端服务器上。

打开四台虚拟机ip分别是10、11、12、13,下面配置每台都配置互信,本地解析。

(1)生成公钥id_rsa.pub和私钥id_rsa(保存在宿主目录下.ssh)

[root@node1 ~]# ssh-keygen -t rsa

(2)将公钥传给对端服务器

[root@node1 ~]# for i in 10 11 12 13;do ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.8.$i;done

(3)可以将对方ip和主机名进行本地解析

[root@node1 ~]# vim /etc/hosts
192.168.8.10 node1
192.168.8.11 node2
192.168.8.12 node3
192.168.8.13 node4

(4)将/etc/hosts 文件拷贝给所有服务器

[root@node1 ~]# for i in 10 11 12 13;do scp /etc/hosts root@192.168.8.$i:/etc/; done

最后使用case来制作一个脚本吧,注意这里是node1主机,四台都做了互信,都可以执行脚本操作。(里面的function后面再讲)

[root@node1 ~]# vim case5.sh
#!/bin/bash
​
Menu(){
cat <<EOF
1.node1-192.168.8.10
2.node2-192.168.8.11
3.node3-192.168.8.12
4.node4-192.168.8.13
h.help
EOF
}
​
Menu
​
read -p "请输入你要连接的主机序号:" CONN
case $CONN in
    1)
    ssh root@192.168.8.10
    ;;
    2)
    ssh root@192.168.8.11
    ;;
    3)
    ssh root@192.168.8.12
    ;;
    4)  
    ssh root@192.168.8.13
    ;;
    h)
    clear
    Menu
    ;;
    *)
    echo "USAGE: $0 输入要连接的主机序号 【1|2|3|4】"
esac    

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【收藏】FP独立站建站安心收款经验分享

前几天有个客户咨询我&#xff0c;跟我说了他的疑问。他是在阿里巴巴国际站上面做鞋服&#xff0c;但看到同行在独立站上铺fp&#xff0c;所以他想问问&#xff1a;怎么建立一个独立站并在上面成功推出fp呢&#xff1f;今天&#xff0c;我就来跟有类似诉求的朋友们分享一下&…

企业邮箱保密性评测揭晓:哪个流行的企业邮箱保密性更高?

大多数流行的电子邮件提供商都没有为您的电子邮件提供足够的保护&#xff0c;这已不是什么秘密。在这里我们将了解流行的电子邮件提供商使用的不同类型的加密&#xff0c;以及您如何选择满足您的隐私需求的企业邮箱最佳提供商。 一、谷歌邮箱 默认情况下&#xff0c;Gmail使用T…

element-ui更改单元格字体颜色

作者创建的项目为vue3ts&#xff0c;写法上有些需要注意的点&#xff1a; 如果script 标签使用了 setup&#xff0c;这个时候 export 是没有必要的&#xff0c;也就是使用了setup 后&#xff0c;就不要再写 export 了&#xff0c;不然会报错“A default export must be at the…

(通用0bug)纯原生实现一个类似浏览器搜索功能(ctrl + f)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 一、问题的描述 由于公司业务需要在搜索框中&#xff0c;模拟Ctrl F 的搜索功能&#xff0c;支持自选可搜索区域范围&#xff0c;且支持回车查看下一个&#xff0c;上下查看&#xff0c;自动滚动定位&#xff0c;…

OpenAI新作,直指DeepMind格局小了!大模型复杂推理应逐步验证

作者 | Python、Zenmoore 谷歌旗下的DeepMind&#xff0c;因AlphaGo而名声大振&#xff1b;而推出ChatGPT的OpenAI&#xff0c;近日更是如日中天。 然而&#xff0c;OpenAI公开了一篇论文[1]&#xff0c;结论同DeepMind去年11月的工作[2]完全相反。在对比差异时&#xff0c;论…

【AI】dragonGPT - 单机部署、极速便捷

dragonGPT 从数据私有化&#xff0c;到prompt向量库匹配&#xff0c;再到查询&#xff0c;一条龙服务&#xff0c;单机部署&#xff0c;极简操作 pre a.需要下载gpt4all model到本地. ggml Model Download Link 然后将存放model的地址写入.env MODEL_PATH your pathb.…

安卓系统远程控制电脑方法

要从安卓设备远程控制计算机&#xff0c;您可以使用专门为此目的设计的远程桌面软件或应用程序。 以下是使用安卓设备远程控制计算机的一般方法&#xff1a; 选择一个远程桌面应用程序&#xff1a;比如 Splashtop 远程控制软件。 在计算机上安装远程桌面软件&#xff1a;要实…

【map和set的封装】

文章目录 前言1 大致框架2 迭代器3 map和set的封装 前言 上篇博客已经讲解了红黑树插入的模拟实现&#xff0c;这篇文章的目的是利用上节课讲解的底层实现来封装map和set.参考代码借鉴的是STL SGI版本3.0 1 大致框架 首先我们来看看源码里面怎么定义的: 从源码中我们不难发现m…

什么是分布式事务?

什么是分布式事务&#xff1f; 分布式对应的是单体架构&#xff0c;互联网早起单体架构是非常流行的&#xff0c;好像是一个家族企业&#xff0c;大家在一个家里劳作&#xff0c;单体架构如下图&#xff1a; 但是随着业务的复杂度提高&#xff0c;大家族人手不够&#xff0c;…

Redis中的哈希结构(Dict)

前言 哈希结构是一个在计算机中非常常见的结构。哈希结构可以让我们在O(1)时间复杂度查找元素并且对其操作&#xff0c;并且增删改查性能并不会随着数据量的增多而改变。反而数据量的增大&#xff0c;会出现两个关键问题&#xff0c;一个是哈希冲突&#xff0c;另一个是rehash…

15、Spring框架

目录 什么是Spring Spring优点 Spring体系结构 Spring新特性 Spring的入门程序 新建立Maven项目 创建名为HelloSpring的类 新建applicationContext.xml文件 XML文件的约束信息配置 测试类TestHelloSpring 控制反转 依赖注入 依赖注入和控制反转的比较 依赖注入的…

虚拟机类加载机制

目录 1、概述 2、类加载的过程 1、过程总览 2、加载 3、链接-验证 4、链接-准备 5、链接-解析 6、初始化 7、总结 3、类加载的时机 4、类加载器 1、概述 2、类与类加载器 3、三层类加载器 4、双亲委派模型 5、其他加载策略 1、概述 一个Java类会被编译成一个Cl…

grep,sed,awk实战

grep -E ^(root|sshd)\> /etc/passwd 找出以root或者sshd开头的&#xff0c;且只含root或者sshd,>表示匹配到root或者sshd就结束了&#xff0c;类似情况如下图&#xff1a; grep -c ^yu /etc/passwd 匹配含yu这个用户出现的次数 grep -m 2 ^yu /etc/passwd …

arthas使用

文章目录 ArthasArthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f;安装1.linux中使用2.docker中使用 命令列表jvm 相关class/classloader 相关monitor/watch/traceprofiler/火焰图 Arthas Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 …

windows nvm 安装过程

1. 官网 Releases coreybutler/nvm-windows GitHubA node.js version management utility for Windows. Ironically written in Go. - Releases coreybutler/nvm-windowshttps://github.com/coreybutler/nvm-windows/releases 下载 nvm-setup.exe; 2. 安装完成后后&#x…

Golang Channel 实现原理与源码分析

Do not communicate by sharing memory; instead, share memory by communicating. 通过通信来共享内存&#xff0c;而不是共享内存来通信 安全访问共享变量是并发编程的一个难点&#xff0c;在 Golang 语言中&#xff0c;倡导通过通信共享内存&#xff0c;实际上就是使用 chan…

23种设计模式之访问者模式(Visitor Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的访问者模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

chatgpt没有免费版的吗?如何使用ChatGPT?

ChatGPT是基于GPT模型的聊天机器人&#xff0c;目前没有免费版。ChatGPT是由OpenAI开发的&#xff0c;OpenAI的GPT模型需要大量的计算资源和技术支持&#xff0c;因此需要付费才能使用。 目前&#xff0c;OpenAI提供了两种方式来使用GPT模型&#xff1a; 1. OpenAI API OpenA…

制造型企业降本增效的最佳工具,质量管理系统,该如何利用好

许多制造业企业质量管理主要用于解决制造业质检效率低下、作业不规范等难题&#xff0c;形成质量检验、质量方案、档案数据、统计分析一体化的质量管理体系&#xff0c;有效为企业质量管理提速降本增效&#xff0c;实现企业数字化转型。在没有正确利用质量管理系统之前&#xf…

45个 Cha​tGPT 常用插件说明

45个 ChatGPT 常用插件说明 ChatGPT常用的45个插件&#xff0c;以及它们用途说明&#xff1a; 1/ Slack&#xff1a;查询Slack信息 2/ Zapier&#xff1a;与5000应用&#xff0c;如Google Sheets和Docs进行交互。 3/ Expedia&#xff1a;在一个地方激活你的旅行计划 4/ Kla…