Shell脚本零基础通关教程|条件语句+函数+全类型循环(企业实战+面试真题)
📌博客简介:Shell脚本是Linux运维、自动化部署、面试的核心必考技能!很多新手学不懂Shell,核心是没有系统掌握条件判断、函数、各类循环语法。本文整合全套Shell核心语法,包含if/case条件、shell函数、while/until/for/select四大循环,搭配超多可直接运行案例、企业生产实战、面试真题,零基础一键吃透!
✅适用人群:Linux新手、运维工程师、后端开发、校招面试、自动化学习
✅核心知识点:if多分支判断、case匹配语句、Shell函数、while/until循环、for/select菜单循环、企业自动化实战
✅全文特点:无废话干货、语法+图解、零基础易懂、代码可直接复制运行
一、Shell脚本整体知识框架
Shell脚本核心语法分为条件语句、函数、循环语句三大模块,各司其职:
条件语句:if(通用多判断)、case(固定值匹配,服务脚本专用)
函数:代码复用、模块化开发,精简脚本、方便维护
循环语句:while(守护进程)、until(条件终止)、for(有限次数遍历)、select(交互式菜单)
二、if条件语句(最常用条件判断)
if语句是Shell中使用频率最高的条件语句,适用于所有场景的逻辑判断,支持单分支、双分支、多分支嵌套,语法灵活、通用性极强。
2.1 五大条件表达式语法
if的判断条件支持5种写法,日常任选其一即可,推荐[]、(())极简写法
# 1.test表达式iftest表达式;then指令;fi# 2.[] 字符串/普通判断(最常用)if[条件];then指令;fi# 3.[[]] 高级判断(支持正则、逻辑运算)if[[条件]];then指令;fi# 4.(()) 算术判断(纯数字比较专用)if((算术表达式));then指令;fi# 5.命令直接作为条件if命令;then指令;fi2.2 三大分支语法结构
1)单分支(满足条件执行,不满足跳过)
if<条件表达式>;then指令fi实战场景:文件夹不存在则创建
if[!-d/tmp/test];thenmkdir/tmp/testfi2)双分支(二选一执行)
if<条件表达式>;then指令集1# 条件成立执行else指令集2# 条件不成立执行fi3)多分支(多条件匹配)
if<条件1>;then指令1elif<条件2>;then指令2elif<条件3>;then指令3else默认指令fi2.3 企业实战案例:sshd服务管控脚本
通过传参实现服务启动、停止、重启、状态查询,工作高频复用脚本
#!/bin/bashif["$1"=="start"];thensystemctl start sshdelif["$1"=="stop"];thensystemctl stop sshdelif["$1"=="status"];thensystemctl status sshdelif["$1"=="restart"];thensystemctl restart sshdelseecho"Usage:$0start|stop|status|restart "fi三、case条件语句(固定值匹配专用)
case语句是多分支if的精简版,专门用于固定字符串/数字匹配,语法工整、可读性强,常用于系统服务启动脚本,是企业服务脚本标配语法。
3.1 核心语法
case"变量值"in值1)指令1;;值2)指令2;;*)默认指令# 匹配失败执行;;esac核心特点:匹配成功执行对应指令,;;结束当前分支,*)兜底匹配,等价于else。
3.2 经典实战案例
1)数字选择判断
#!/bin/bashread-p"请输入1-3的数字: "numcase$numin1)echo"您输入的数字是:$num";;2)echo"您输入的数字是:$num";;3)echo"您输入的数字是:$num";;*)echo"请输入1-3之间的有效数字!";;esac2)企业级sshd服务脚本(最简版)
#!/bin/bashcase$1instart|stop|restart|reload|status)systemctl$1sshd;;*)echo"Usage:$0start|stop|restart|reload|status";;esac3)终端彩色输出脚本
#!/bin/bashcase$1inPASS)echo-e'\033[1;32mPASS\033[0;39m';;FAIL)echo-e'\033[1;31mFAIL\033[0;39m';;DONE)echo-e'\033[1;35mDONE\033[0;39m';;*)echo"Usage:$0PASS|FAIL|DONE";;esac3.3 if与case使用场景区别
if:通用性强,支持数值比较、范围判断、复杂逻辑,适用所有场景
case:仅适配固定离散值(start/stop/数字),代码更规范,专属服务脚本
四、Shell函数(代码复用模块化)
函数的核心作用:封装重复代码、实现模块化、精简脚本、便于维护,一次定义、多次调用,是高级Shell脚本必备语法。
4.1 三种函数语法
# 标准写法function函数名(){指令returnn}# 简化写法1(省略括号)function函数名{指令returnn}# 简化写法2(省略function)函数名 (){指令returnn}4.2 函数核心规则(必记)
函数必须先定义、后调用,否则报 command not found
调用函数直接写函数名,无需加括号
return:退出函数;exit:退出整个脚本local:定义函数局部变量,仅函数内部生效执行优先级:系统别名 > 函数 > 系统命令 > 可执行文件
4.3 基础实战案例
#!/bin/bash# 定义函数functionhello(){echo"Hello World !"}# 调用函数hello五、while与until循环(无限/条件循环)
while和until属于条件循环,主打无限循环、守护进程、定时监测,是运维后台常驻脚本的核心语法。
5.1 核心区别
while(当型循环):条件为真,持续循环;条件为假,退出循环(可能一次不执行)
until(直到型循环):条件为假,持续循环;条件为真,退出循环
5.2 标准语法
# while语法while[条件]do循环体done# until语法until[条件]do循环体done5.3 基础案例:降序打印5-1
# while实现#!/bin/bashi=5while((i>0))doecho$i((i--))done# until实现#!/bin/bashi=5until((i==0))doecho$i((i--))done5.4 企业生产实战
1)每2秒监控系统负载(守护进程)
#!/bin/bash# 无限循环打印系统负载,后台运行常驻监控whiletruedouptime>>/tmp/loadaverage.logsleep2done2)5秒监测sshd服务,异常自动重启
#!/bin/bashwhiletruedosystemctl is-active sshd.service&>/dev/nullif[$?-ne0];thensystemctl restart sshd.service&>/dev/nullfisleep5done5.5 脚本后台运行必备命令
脚本名&:后台运行脚本nohup 脚本名&:后台永久运行,关闭终端不中断ctrl+z:暂停任务、bg:放入后台、fg:切回前台jobs:查看后台任务、kill %任务号:关闭后台脚本
六、for与select循环(遍历/菜单循环)
for循环主打有限次数遍历,是日常脚本最常用循环;select主打交互式菜单选择,用于自定义交互脚本。
6.1 for循环两种语法
1)变量取值型(遍历列表)
for变量名in取值列表do指令done支持{1..5}、$(seq 1 5)取值,适合批量遍历操作
2)C语言型(规范次数循环)
for((i=1;i<=5;i++))do指令done6.2 for循环经典案例
1)升降序打印数字
# 升序 1-5foriin{1..5};doecho$i;done# 降序 5-1foriin{5..1};doecho$i;done2)九九乘法表(面试必考)
#!/bin/bashfornum1in{1..9}dofor((num2=1;num2<=num1;num2++))doecho-en"$num2*$num1=$[ num2 * num1 ]\t"doneechodone3)企业批量运维脚本
# 批量设置服务开机自启#!/bin/bashforserviceincrond atd chronyddosystemctlenable$servicedone# 批量扫描局域网在线主机(并发优化)#!/bin/shforiin`seq1254`do{ping-c210.1.8.$i&>/dev/nullif[$?-eq0];thenecho"10.1.8.$iis online">>node_online.txtelseecho"10.1.8.$iis offline">>node_offline.txtfi}&donewait6.3 select交互式菜单循环
select是无限交互式菜单循环,用户输入序号选择功能,无主动退出逻辑,需配合exit终止。
核心语法
select变量名in菜单列表do指令done实战:自定义课程选择菜单
#!/bin/bashPS3="请选择你的课程:"# 自定义提示符selectcourseinlinux mysql pythonexitdoecho"你选择了第$REPLY个课程"case$courseinlinux)echo"选择课程:Linux运维";;mysql)echo"选择课程:MySQL数据库";;python)echo"选择课程:Python开发";;exit)exit;;esacechodone核心变量:PS3(自定义提示符)、REPLY(获取用户输入序号)
七、Shell全语法场景终极总结
| 语法模块 | 核心适用场景 |
|---|---|
| if条件语句 | 通用所有逻辑判断、范围比较、多条件分支 |
| case语句 | 固定值匹配、系统服务启停脚本、代码规范化 |
| Shell函数 | 重复代码封装、脚本模块化、精简维护 |
| while循环 | 守护进程、后台常驻监测、无限循环任务 |
| until循环 | 条件终止型循环,场景与while互补 |
| for循环 | 有限次数遍历、批量操作、文件处理、批量运维 |
| select循环 | 交互式菜单制作、用户选择型脚本 |
八、新手高频避坑指南
if/case/循环语句必须成对结束(fi/esac/done),缺一直接报错
函数必须先定义后调用,否则识别为未知命令
while无限循环必须加sleep,避免占用100%CPU资源
select无自动退出,必须搭配exit实现终止
批量扫描脚本添加&实现并发,大幅提升执行效率
💡 点赞+收藏!全网最全Shell零基础通关手册,覆盖入门+实战+面试,持续更新运维自动化案例!