shell之case语句与函数
目录
一、case语句
1.1 语法结构
case var in 定义变量;var代表是变量名 pattern 1) 模式1;用 | 分割多个模式,相当于or command1 需要执行的语句 ;; 两个分号代表命令结束 pattern 2) command2 ;; pattern 3) command3 ;; *) default,不满足以上模式,默认执行*)下面的语句 command4 ;; esac esac表示case语句结束 #pattern表示需要匹配的模式
1.2 应用案例
1)脚本传不同值做不同事
① 需求:
当给程序传入start、stop、restart三个不同参数时分别执行相应命令!
② 实现:
#!/bin/bash case $1 in start|S) service httpd start &> /dev/null && echo "httpd 启动成功" ;; stop|T) service httpd stop &> /dev/null && echo "httpd 停止成功" ;; restart|R) service httpd restart &> /dev/null && echo "httpd 重启成功" ;; *) echo "请输入对应的值(start|stop|restart)……" ;; esac
2)根据用户需求选择做事
① 需求:
脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作!
② 实现:
#!/bin/bash read -p "请输入你需要管理的服务名称(httpd|vsftpd):" service case $service in vsftpd|ftp) read -p "请选择需要执行的指令(start|stop|restart):" action1 case $action1 in start) service vsftpd start &> /dev/null && echo "${service}服务已经启动成功" ;; stop) service vsftpd stop &> /dev/null && echo "${service}服务已经停止成功" ;; restart) service vsftpd restart &> /dev/null && echo "${service}服务已经重启成功" ;; esac ;; httpd|apache) read -p "请选择需要执行的指令(start|stop|restart):" action2 case $action2 in start) service httpd start &> /dev/null && echo "${service}服务已经启动成功" ;; stop) service httpd stop &> /dev/null && echo "${service}服务已经停止成功" ;; restart) service httpd restart &> /dev/null && echo "${service}服务已经重启成功" ;; esac ;; esac
3)菜单提示让用户选择需要做的事
① 需求:
模拟一个多任务维护界面,当执行程序时先显示总菜单,然后进行选择后做相应的操作!如下:
**********请选择********* h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 *************************
② 实现:
#!/bin/bash #打印菜单 menu(){ cat <<END h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 END } menu while true do read -p "请输入你的操作[h for help]:" var1 case $var1 in h) menu ;; f) read -p "请输入你要查看的设备名字[/dev/sdb]:" var2 case $var2 in /dev/sda) fdisk -l /dev/sda ;; /dev/sdb) fdisk -l /dev/sdb ;; esac ;; d) lsblk ;; m) free -m ;; u) uptime ;; q) exit ;; esac done
二、函数
2.1 函数简介
- shell中允许将一组命令集合或语句形成一段可用代码,这些代码成为shell函数;
- 给这段代码起个名称成为函数名,后续可以直接调用这段代码的功能;
2.2 定义函数
1)方法一
函数名() { 函数体(一堆命令的集合,来实现某个功能) }
2)方法二
function 函数名() { 函数体(一堆命令的集合,来实现某个功能) echo hello echo world }
函数中return说明:
1)return可以结束一个函数。类似于循环控制语句break结束当前循环。执行循环体后的代码;
2)return默认返回函数中最后一个命令状态值,也可给定参数值,范围是0~256之间;
3)如果没有return命令,函数将返回最后一个指定的退出状态值;
2.3 调用函数
1)当前命令行调用
$ vim 1.sh #!/bin/bash hello(){ echo “hello lzj $1” hostname } menu(){ cat <<-EOF 1.mysql 2.web 3.app 4.exit EOF } $ source 1.sh $ hello 888 “hello lzj 888” localhost.localdomain $ menu 1.mysql 2.web 3.app 4.exit
2)定义到用户的环境变量中
$ vim ~/.bashrc 文件中增加如下内容: hello(){ echo "hello lzj $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF } 注意:当用户打开bash的时候会读取该文件
3)脚本中调用
$ vim 2.sh #!/bin/bash #打印菜单 source ./1.sh menu(){ cat <<-EOF h 显示帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 EOF } menu $ sh 2.sh h 显示帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序
4)应用示例
① 需求:
1)写一个脚本收集用户输入的基本信息(姓名、性别、年龄)。如果不输入,一直提示输入;
2)最后根据用户的信息输出相对应的内容;
② 实现:
#!/bin/bash #该函数实现用户如果不输入内容则一直循环知道用户输入位置,并且将用户输入的内容打印出来 input_fun(){ input_var="" output_var=$1 while [ -z $input_var ] do read -p "$output_var" input_var done echo $input_var } #调用函数并且获取用户的姓名、性别、年龄分别负责赋值给name、sex、age name=$(input_fun 请输入您的姓名:) sex=$(input_fun 请输入您的性别:) age=$(input_fun 请输入您的年龄:) #根据用户输入的性别进行匹配判断 case $sex in man) if [ $age -gt 18 -a $age -le 35 ];then echo "年轻有为!加油" elif [ $age -gt 35 ];then echo "有点老了" else echo "太小了!" fi ;; woman) echo "小姐姐" ;; esac
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律