Shell脚本零基础通关教程|条件语句+函数+全类型循环(企业实战+面试真题)

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零基础通关手册,覆盖入门+实战+面试,持续更新运维自动化案例!

相关推荐
吴声子夜歌1 小时前
Java面试——数据结构(二)
java·数据结构·面试
Rain的Java大神之路12 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
官乐15 小时前
AI面试指南(多agent开发流程)
人工智能·面试·职场和发展
程序员三藏15 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
码匠许师傅15 小时前
【C++ 面试真题】27. 聊聊 C++ 的内存泄漏与内存布局
java·c++·面试
跟我一起学测试呀16 小时前
软件测试面试总结,备战金九银十
面试·职场和发展
Nil20816 小时前
leetcode 98验证二叉搜索树
算法·leetcode·职场和发展
swipe18 小时前
RabbitMQ 实战:AI Agent 里异步处理的标配方案(手把手 + 4 种交换机全解析)
后端·面试·langchain
时针滴滴答啊21 小时前
最大子数组和
算法·leetcode·职场和发展