跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Linux Shell 编程之条件语句详解

Linux Shell 脚本的条件语句是实现自动化逻辑判断的基础,涵盖基础条件测试与流程控制语句。基础测试包括文件、整数值、字符串及逻辑四类,核心为返回状态值判断。流程控制包含 if 语句(单/双/多分支)和 case 语句(变量匹配)。编写时需注意方括号空格、变量引号及符号规范,根据场景选择合适的语句结构以提升脚本可读性与效率。

月光旅人发布于 2026/3/16更新于 2026/9/1172 浏览

Linux Shell 编程之条件语句

Shell 脚本是 Linux 系统自动化运维、批量处理任务的核心工具,而条件语句是让 Shell 脚本拥有'判断能力'的关键,能根据不同条件执行不同操作,让脚本从简单的命令拼接升级为具备逻辑思维的程序。本文将从基础的条件测试操作入手,详细讲解 if 条件语句和 case 分支语句的使用。

一、基础条件测试操作

Shell 通过返回状态值判断命令执行结果,返回 0 表示成功/条件成立,非 0 表示失败/条件不成立。条件测试是实现判断的基础,专门用于检测文件状态、数值大小、字符串匹配等情况,核心有两种写法,方括号写法更常用:

  1. test 条件表达式
  2. [ 条件表达式 ]

注意:方括号与条件表达式之间必须有至少一个空格,这是 Shell 语法的硬性要求,遗漏会直接报错。

根据测试对象不同,条件测试分为文件测试、整数值比较、字符串比较和逻辑测试四类,以下是最常用的测试选项及实操示例。

1. 文件测试:判断文件/目录的状态

针对文件或目录的路径,检测其是否存在、类型、权限等,操作选项放在测试对象前,常用选项如下:

选项作用
-d测试是否为目录(Directory)
-e测试文件/目录是否存在(Exist)
-f测试是否为普通文件(File)
-r测试当前用户是否有读取权限(Read)
-w测试当前用户是否有写入权限(Write)
-x测试当前用户是否有执行权限(Execute)
# 示例:测试/tmp/test 是否为目录
[ -d /tmp/test ]
echo $? # 查看前一条命令的返回值,返回 0 为成立,非 0 为不成立
# 示例:测试/tmp/test 是否为目录,存在则输出'存在'
[ -d /tmp/test ] && echo "存在"
# 无输出表示该目录不存在,输出则表示存在

&& 为逻辑与,仅当前面命令执行成功(条件成立)时,才执行后面的命令。

2. 整数值比较:判断两个整数的大小

仅适用于整数比较,不能用于小数/字符串,操作选项放在两个整数之间,常用选项如下:

选项作用
-eq两数相等(Equal)
-ne两数不相等(Not Equal)
-gt第一个数大于第二个数(Greater Than)
-lt第一个数小于第二个数(Lesser Than)
-le第一个数小于等于第二个数
-ge第一个数大于等于第二个数
# 示例:判断当前登录用户数是否超过 3,超过则提示'用户过多'
num=$(who | wc -l) # 提取登录用户数
[ $num -gt 3 ] && echo "用户过多"
3. 字符串比较:判断字符串是否匹配/为空

用于检测字符串是否相同、是否为空,常用于判断用户输入、系统环境变量,常用选项如下:

选项作用
=两个字符串完全相同(注意是单等号)
!=两个字符串不相同,其中'!'符号表示取反
-z测试字符串是否为空(长度为 0)
-n测试字符串是否非空(长度不为 0)
# 示例 1:判断系统语言是否为中文,非中文则提示
[ $LANG != "zh_CN.UTF-8" ] && echo "当前非中文环境"

# 示例 2:判断用户输入是否为空,为空则提示
read -p "请输入内容:" input
[ -z "$input" ] && echo "输入内容不能为空"
4. 逻辑测试:判断多个条件的关系

用于组合多个测试条件,判断其'与/或/非'关系,常用操作如下(推荐符号写法,更直观):

操作符作用等价写法(test 命令用)
&&逻辑与:多个条件同时成立才成立-a
||逻辑或:多个条件一个成立就成立-o
!逻辑非:取反,条件不成立时结果才成立!
# 示例:判断整数 num 是否在 10~20 之间
num=15
[ $num -ge 10 ] && [ $num -le 20 ] && echo "在 10~20 之间"

# 补充:逻辑非的使用,测试/tmp/test 是否不是目录
[ ! -d /tmp/test ] && echo "不是目录或不存在"
补充知识点 1:条件测试的简化输出

除了 &&,还可搭配 ||(逻辑或)实现'条件成立输出 A,不成立输出 B',无需额外语句,极简实用:

# 测试/tmp/test 是否存在,存在输出'存在',否则输出'不存在'
[ -e /tmp/test ] && echo "存在" || echo "不存在"

二、if 条件语句:按条件执行不同命令序列

条件测试仅能实现简单的判断输出,当需要根据条件执行多条命令时,需使用 if 条件语句。根据逻辑复杂度,分为单分支、双分支、多分支三种结构,核心特点是层次清晰、适合多条件嵌套。

1. 单分支 if 语句:条件成立才执行

适用场景:仅需要在'条件成立'时执行命令,条件不成立则无操作。

语法格式:

if 条件测试操作
then
    命令序列 # 条件成立时执行,可写多条命令
fi # 结束 if 判断,不可省略
#!/bin/bash
BACKUP_DIR="/data/backup"
if [ ! -d $BACKUP_DIR ]; then
    mkdir -p $BACKUP_DIR
    echo "备份目录创建成功:$BACKUP_DIR"
fi
2. 双分支 if 语句:条件成立/不成立分别执行

适用场景:需要对'条件成立'和'条件不成立'两种情况分别执行不同命令序列,是最常用的结构。

语法格式:

if 条件测试操作
then
    命令序列 1 # 条件成立执行
else
    命令序列 2 # 条件不成立执行
fi
#!/bin/bash
IP=$1 # 接收位置参数,指定目标 IP
ping -c 2 -i 0.5 -W 2 $IP &>/dev/null # 发送 2 个包,超时 2 秒,屏蔽输出

if [ $? -eq 0 ]; then # $?获取上一条命令返回值,0 表示 ping 通
    echo "主机$IP 在线"
else
    echo "主机$IP 离线"
fi

执行效果:

bash ping_host.sh 192.168.1.100 # 检测 192.168.1.100
3. 多分支 if 语句:多个条件依次判断

适用场景:存在多个互斥条件,需要依次判断,满足某个条件则执行对应命令,所有条件都不满足则执行默认命令。

语法格式:

if 条件测试操作 1
then
    命令序列 1 # 条件 1 成立执行
elif 条件测试操作 2
then
    命令序列 2 # 条件 2 成立执行 # 可添加多个 elif 条件
else
    命令序列 n # 所有条件都不成立执行
fi
#!/bin/bash
# 循环接收输入,直到输入合法
while true; do
    read -p "输入您的分数 (0-100):" GRADE
    
    # 第一步:正则校验是否为纯数字(仅允许 0-9 的数字,无其他字符)
    if ! [[ $GRADE =~ ^[0-9]+$ ]]; then
        echo "错误:请输入纯数字,请勿输入字母、符号或空格!"
        continue
    fi
    
    # 第二步:校验数字是否在 0-100 范围内
    if [ $GRADE -lt 0 ] || [ $GRADE -gt 100 ]; then
        echo "错误:分数范围必须在 0-100 之间,请重新输入!"
        continue
    fi
    
    # 输入合法,退出循环
    break
done

# 原有分数等级判断逻辑
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then
    echo "$GRADE 分,优秀!"
elif [ $GRADE -ge 60 ] && [ $GRADE -le 84 ]; then
    echo "$GRADE 分,合格!"
else
    echo "$GRADE 分,不及格!"
fi

执行:

bash aaa.sh # 然后输入自己的数字
补充知识点 2:if 语句的条件拓展

if 后的条件测试操作不仅可以是 [ 表达式 ],还可以是任意 Linux 命令,Shell 会根据命令的返回值判断:返回 0 则条件成立,非 0 则不成立。

示例:直接用 ping 命令作为 if 条件,简化主机连通性检测

if ping -c 2 192.168.1.100 &>/dev/null; then
    echo "主机在线"
else
    echo "主机离线"
fi

三、case 分支语句:匹配变量的多个取值

case 语句与多分支 if 语句功能类似,专门适用于'一个变量有多个固定取值,每个取值对应不同操作' 的场景,相比多分支 if 语句,case 语句语法更简洁、可读性更高,无需多次写条件测试,仅需匹配变量取值。

1. case 语句的基本语法

核心特点:按顺序匹配变量的取值,匹配成功则执行对应命令序列,匹配后直接退出(无需判断后续条件),无匹配项则执行默认操作。

case 变量值 in
    模式 1)
        命令序列 1
        ;; # 结束当前模式,不可省略,相当于'break'
    模式 2)
        命令序列 2
        ;; # 可添加多个模式
    *) # 通配符,匹配所有未定义的模式,即默认模式
        默认命令序列
esac # 结束 case 判断,不可省略
2. 模式匹配规则(实用拓展)

case 的模式支持通配符和范围匹配,让取值匹配更灵活,常用规则:

  1. [a-z]:匹配小写字母 a 到 z 的任意一个;
  2. [0-9]:匹配数字 0 到 9 的任意一个;
  3. A|B:匹配 A 或 B,如 start|begin;
  4. *:通配符,匹配任意字符(即默认模式 *);
  5. ?:匹配单个任意字符。
3. case 语句实操示例
示例 1:判断用户输入的字符类型
#!/bin/bash
read -p "请输入一个字符:" key
case $key in
    [a-z]|[A-Z]) # 匹配任意字母
        echo "您输入的是【字母】"
        ;;
    [0-9]) # 匹配任意数字
        echo "您输入的是【数字】"
        ;;
    *) # 匹配其他所有字符
        echo "您输入的是【特殊字符/空格/功能键】"
        ;;
esac
示例 2:编写简易服务控制脚本
#!/bin/bash
# 服务控制脚本:./service.sh start/stop/restart/status
case $1 in
    start)
        echo -n "正在启动服务..."
        sleep 3600 &>/dev/null & # 后台启动 sleep 进程
        echo "启动成功"
        ;;
    stop)
        echo -n "正在停止服务..."
        pkill sleep &>/dev/null # 终止 sleep 进程
        echo "停止成功"
        ;;
    restart)
        $0 stop # $0 表示当前脚本名,调用自身的 stop 操作
        $0 start # 调用自身的 start 操作
        echo "重启成功"
        ;;
    status)
        if pgrep sleep &>/dev/null; then
            echo "服务【运行中】"
        else
            echo "服务【已停止】"
        fi
        ;;
    *)
        echo "用法:$0 {start|stop|restart|status}" # 提示正确用法
        ;;
esac

执行效果:

bash service.sh start # 启动服务
bash service.sh status # 查看状态
bash service.sh stop # 停止服务
补充知识点 3:if 与 case 的适用场景对比

if 和 case 都能实现多条件判断,核心区别在于判断依据,实际使用中按以下原则选择,让脚本更简洁:

  1. 用 if 的场景:判断多个不同的条件(如数值范围、多个文件状态、混合条件),或条件之间有嵌套关系;
  2. 用 case 的场景:判断一个变量的多个固定取值(如服务的 start/stop、字符类型、菜单选择),取值为离散的固定值。

四、核心语法注意事项(避坑重点)

  1. 方括号 [ ] 与条件表达式之间必须有空格,如 [ $num -gt 10 ],不可写为 [$num -gt 10];
  2. 变量取值建议用双引号包裹,避免因空格、特殊字符导致报错,如 [ -z "$input" ];
  3. case 语句中,每个模式必须以)结束,命令序列后必须加 ;;,否则脚本执行异常;
  4. 整数值比较不能用 >/<,Shell 中 </> 是重定向符号,会导致语法错误,必须用 -gt/-lt 等;
  5. 字符串比较的 = 前后建议加空格,避免与变量赋值混淆(赋值是 变量=值,无空格)。

五、本章小结

  1. 条件测试是 Shell 判断的基础,分为文件、整数值、字符串、逻辑四类,[ 表达式 ] 是最常用写法;
  2. if 条件语句分单/双/多分支,适合多条件、多场景的逻辑判断,支持命令作为条件;
  3. case 分支语句适合单变量的多固定取值匹配,语法简洁、执行效率高,支持通配符模式匹配;
  4. 实际脚本编写中,根据判断依据选择 if 或 case,同时注意 Shell 的语法细节,避免空格、符号等低级错误。

掌握条件语句后,Shell 脚本将具备基本的逻辑处理能力,后续可结合循环语句实现更复杂的自动化任务(如批量检测主机、批量备份文件、自动化部署服务等),是 Linux 自动化运维的必备基础。

目录

  1. Linux Shell 编程之条件语句
  2. 一、基础条件测试操作
  3. 1. 文件测试:判断文件/目录的状态
  4. 示例:测试/tmp/test 是否为目录
  5. 示例:测试/tmp/test 是否为目录,存在则输出“存在”
  6. 无输出表示该目录不存在,输出则表示存在
  7. 2. 整数值比较:判断两个整数的大小
  8. 示例:判断当前登录用户数是否超过 3,超过则提示“用户过多”
  9. 3. 字符串比较:判断字符串是否匹配/为空
  10. 示例 1:判断系统语言是否为中文,非中文则提示
  11. 示例 2:判断用户输入是否为空,为空则提示
  12. 4. 逻辑测试:判断多个条件的关系
  13. 示例:判断整数 num 是否在 10~20 之间
  14. 补充:逻辑非的使用,测试/tmp/test 是否不是目录
  15. 补充知识点 1:条件测试的简化输出
  16. 测试/tmp/test 是否存在,存在输出“存在”,否则输出“不存在”
  17. 二、if 条件语句:按条件执行不同命令序列
  18. 1. 单分支 if 语句:条件成立才执行
  19. 2. 双分支 if 语句:条件成立/不成立分别执行
  20. 3. 多分支 if 语句:多个条件依次判断
  21. 循环接收输入,直到输入合法
  22. 原有分数等级判断逻辑
  23. 补充知识点 2:if 语句的条件拓展
  24. 三、case 分支语句:匹配变量的多个取值
  25. 1. case 语句的基本语法
  26. 2. 模式匹配规则(实用拓展)
  27. 3. case 语句实操示例
  28. 示例 1:判断用户输入的字符类型
  29. 示例 2:编写简易服务控制脚本
  30. 服务控制脚本:./service.sh start/stop/restart/status
  31. 补充知识点 3:if 与 case 的适用场景对比
  32. 四、核心语法注意事项(避坑重点)
  33. 五、本章小结

更多推荐文章

查看全部
  • AI 一人公司 OPC 模式全解析
  • C++ 基础:auto 关键字、范围 for 循环与迭代器
  • LLM 大模型量化技术、QLoRA 及常用量化库详解
  • Spring Boot 核心原理与面试高频考点解析
  • RAG 检索增强生成技术入门与实战指南
  • Linux 路径符号详解:~、. 和 / 的含义与区别
  • KingbaseES 内核级 SQL 防火墙:白名单机制与性能实测
  • 个人如何利用 Python 爬虫技术实现变现
  • C++ 手写 JSON 与 HTTP Web 服务器实战
  • AI Agent 新范式:FastGPT+MCP 协议实现工具增强型智能体构建
  • 线性代数导引:可构造数域 K
  • JD-GUI 实战指南:Java 字节码反编译工具使用详解
  • Pyenv 指定 Python 版本:灵活对接 Miniconda 环境
  • ESP-Drone 开源无人机项目开发与调试指南
  • PaperRed AI 论文写作与查重工具功能详解
  • 如何利用 Python 学习网络爬虫技术
  • 模型版本控制:管理 Llama Factory 微调成果
  • GPT-OSS-20B 模型本地部署及 WebUI 交互指南
  • OpenClaw 多飞书机器人接入与多 Agent 团队协作实战复盘
  • 滑动窗口算法详解与实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online