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种写法,日常任选其一即可,推荐 []、(()) 极简写法
bash
# 1.test表达式
if test 表达式;then 指令;fi
# 2.[] 字符串/普通判断(最常用)
if [ 条件 ];then 指令;fi
# 3.[[]] 高级判断(支持正则、逻辑运算)
if [[ 条件 ]];then 指令;fi
# 4.(()) 算术判断(纯数字比较专用)
if ((算术表达式));then 指令;fi
# 5.命令直接作为条件
if 命令;then 指令;fi
2.2 三大分支语法结构
1)单分支(满足条件执行,不满足跳过)
bash
if <条件表达式>;then
指令
fi
实战场景:文件夹不存在则创建
bash
if [ ! -d /tmp/test ];then
mkdir /tmp/test
fi
2)双分支(二选一执行)
bash
if <条件表达式>;then
指令集1 # 条件成立执行
else
指令集2 # 条件不成立执行
fi
3)多分支(多条件匹配)
bash
if <条件1>;then
指令1
elif <条件2>;then
指令2
elif <条件3>;then
指令3
else
默认指令
fi
2.3 企业实战案例:sshd服务管控脚本
通过传参实现服务启动、停止、重启、状态查询,工作高频复用脚本
bash
#!/bin/bash
if [ "$1" == "start" ];then
systemctl start sshd
elif [ "$1" == "stop" ];then
systemctl stop sshd
elif [ "$1" == "status" ];then
systemctl status sshd
elif [ "$1" == "restart" ];then
systemctl restart sshd
else
echo "Usage: $0 start|stop|status|restart "
fi
三、case条件语句(固定值匹配专用)
case语句是多分支if的精简版 ,专门用于固定字符串/数字匹配,语法工整、可读性强,常用于系统服务启动脚本,是企业服务脚本标配语法。
3.1 核心语法
bash
case "变量值" in
值1)
指令1
;;
值2)
指令2
;;
*)
默认指令 # 匹配失败执行
;;
esac
核心特点:匹配成功执行对应指令,;; 结束当前分支,*) 兜底匹配,等价于else。
3.2 经典实战案例
1)数字选择判断
bash
#!/bin/bash
read -p "请输入1-3的数字: " num
case $num in
1)
echo "您输入的数字是:$num"
;;
2)
echo "您输入的数字是:$num"
;;
3)
echo "您输入的数字是:$num"
;;
*)
echo "请输入1-3之间的有效数字!"
;;
esac
2)企业级sshd服务脚本(最简版)
bash
#!/bin/bash
case $1 in
start|stop|restart|reload|status)
systemctl $1 sshd
;;
*)
echo "Usage: $0 start|stop|restart|reload|status"
;;
esac
3)终端彩色输出脚本
bash
#!/bin/bash
case $1 in
PASS)
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: $0 PASS|FAIL|DONE"
;;
esac
3.3 if与case使用场景区别
-
if:通用性强,支持数值比较、范围判断、复杂逻辑,适用所有场景
-
case:仅适配固定离散值(start/stop/数字),代码更规范,专属服务脚本
四、Shell函数(代码复用模块化)
函数的核心作用:封装重复代码、实现模块化、精简脚本、便于维护,一次定义、多次调用,是高级Shell脚本必备语法。
4.1 三种函数语法
bash
# 标准写法
function 函数名 () {
指令
return n
}
# 简化写法1(省略括号)
function 函数名 {
指令
return n
}
# 简化写法2(省略function)
函数名 () {
指令
return n
}
4.2 函数核心规则(必记)
-
函数必须先定义、后调用,否则报 command not found
-
调用函数直接写函数名,无需加括号
-
return:退出函数;exit:退出整个脚本 -
local:定义函数局部变量,仅函数内部生效 -
执行优先级:系统别名 > 函数 > 系统命令 > 可执行文件
4.3 基础实战案例
bash
#!/bin/bash
# 定义函数
function hello () {
echo "Hello World !"
}
# 调用函数
hello
五、while与until循环(无限/条件循环)
while和until属于条件循环,主打无限循环、守护进程、定时监测,是运维后台常驻脚本的核心语法。
5.1 核心区别
-
while(当型循环):条件为真,持续循环;条件为假,退出循环(可能一次不执行)
-
until(直到型循环):条件为假,持续循环;条件为真,退出循环
5.2 标准语法
bash
# while语法
while [ 条件 ]
do
循环体
done
# until语法
until [ 条件 ]
do
循环体
done
5.3 基础案例:降序打印5-1
bash
# while实现
#!/bin/bash
i=5
while ((i>0))
do
echo $i
((i--))
done
# until实现
#!/bin/bash
i=5
until ((i==0))
do
echo $i
((i--))
done
5.4 企业生产实战
1)每2秒监控系统负载(守护进程)
bash
#!/bin/bash
# 无限循环打印系统负载,后台运行常驻监控
while true
do
uptime >> /tmp/loadaverage.log
sleep 2
done
2)5秒监测sshd服务,异常自动重启
bash
#!/bin/bash
while true
do
systemctl is-active sshd.service &>/dev/null
if [ $? -ne 0 ];then
systemctl restart sshd.service &>/dev/null
fi
sleep 5
done
5.5 脚本后台运行必备命令
-
脚本名&:后台运行脚本 -
nohup 脚本名&:后台永久运行,关闭终端不中断 -
ctrl+z:暂停任务、bg:放入后台、fg:切回前台 -
jobs:查看后台任务、kill %任务号:关闭后台脚本
六、for与select循环(遍历/菜单循环)
for循环主打有限次数遍历 ,是日常脚本最常用循环;select主打交互式菜单选择,用于自定义交互脚本。
6.1 for循环两种语法
1)变量取值型(遍历列表)
bash
for 变量名 in 取值列表
do
指令
done
支持 {1..5}、$(seq 1 5) 取值,适合批量遍历操作
2)C语言型(规范次数循环)
bash
for ((i=1;i<=5;i++))
do
指令
done
6.2 for循环经典案例
1)升降序打印数字
bash
# 升序 1-5
for i in {1..5};do echo $i;done
# 降序 5-1
for i in {5..1};do echo $i;done
2)九九乘法表(面试必考)
bash
#!/bin/bash
for num1 in {1..9}
do
for ((num2=1;num2<=num1;num2++))
do
echo -en "$num2*$num1=$[ num2 * num1 ]\t"
done
echo
done
3)企业批量运维脚本
bash
# 批量设置服务开机自启
#!/bin/bash
for service in crond atd chronyd
do
systemctl enable $service
done
# 批量扫描局域网在线主机(并发优化)
#!/bin/sh
for i in `seq 1 254`
do
{
ping -c2 10.1.8.$i &> /dev/null
if [ $? -eq 0 ];then
echo "10.1.8.$i is online" >> node_online.txt
else
echo "10.1.8.$i is offline" >> node_offline.txt
fi
} &
done
wait
6.3 select交互式菜单循环
select是无限交互式菜单循环,用户输入序号选择功能,无主动退出逻辑,需配合exit终止。
核心语法
bash
select 变量名 in 菜单列表
do
指令
done
实战:自定义课程选择菜单
bash
#!/bin/bash
PS3="请选择你的课程:" # 自定义提示符
select course in linux mysql python exit
do
echo "你选择了第 $REPLY 个课程"
case $course in
linux) echo "选择课程:Linux运维";;
mysql) echo "选择课程:MySQL数据库";;
python) echo "选择课程:Python开发";;
exit) exit;;
esac
echo
done
核心变量:PS3(自定义提示符)、REPLY(获取用户输入序号)
七、Shell全语法场景终极总结
| 语法模块 | 核心适用场景 |
|---|---|
| if条件语句 | 通用所有逻辑判断、范围比较、多条件分支 |
| case语句 | 固定值匹配、系统服务启停脚本、代码规范化 |
| Shell函数 | 重复代码封装、脚本模块化、精简维护 |
| while循环 | 守护进程、后台常驻监测、无限循环任务 |
| until循环 | 条件终止型循环,场景与while互补 |
| for循环 | 有限次数遍历、批量操作、文件处理、批量运维 |
| select循环 | 交互式菜单制作、用户选择型脚本 |
八、新手高频避坑指南
-
if/case/循环语句必须成对结束(fi/esac/done),缺一直接报错
-
函数必须先定义后调用,否则识别为未知命令
-
while无限循环必须加sleep,避免占用100%CPU资源
-
select无自动退出,必须搭配exit实现终止
-
批量扫描脚本添加&实现并发,大幅提升执行效率
💡 点赞+收藏!全网最全Shell零基础通关手册,覆盖入门+实战+面试,持续更新运维自动化案例!