当前位置: 首页 > news >正文

Shell脚本-流程控制语句基本语法结构

一、前言

在 Linux 系统管理和自动化运维中,Shell 脚本 是最常用的工具之一。而要编写高效、灵活的 Shell 脚本,掌握 流程控制语句 是必不可少的基础技能。

本文将带你全面学习 Shell 脚本中常用的流程控制语句,包括:

if 条件判断(单分支、双分支、多分支)
case 多分支选择
for 循环(遍历列表、C 风格)
whileuntil 循环
breakcontinue 控制循环
✅ 实际开发中的典型应用案例

所有代码均使用 bash 编写,兼容大多数 Linux/Unix 系统。

二、Shell 脚本基础回顾

在开始之前,确保你的脚本以正确的解释器开头:

#!/bin/bash

保存为 .sh 文件后,赋予执行权限:

chmod +x script.sh
./script.sh

三、if 条件判断语句

if 语句是最基本的条件控制结构,用于根据条件执行不同的代码块。

✅ 1. 单分支 if 语句

if [ 条件 ]; then命令
fi
示例:判断文件是否存在
#!/bin/bash
if [ -f "/etc/passwd" ]; thenecho "文件存在"
fi

✅ 2. 双分支 if-else 语句

if [ 条件 ]; then命令1
else命令2
fi
示例:判断用户输入是否为正数
#!/bin/bash
read -p "请输入一个数字:" numif [ $num -gt 0 ]; thenecho "这是一个正数"
elseecho "这不是一个正数"
fi

✅ 3. 多分支 if-elif-else 语句

if [ 条件1 ]; then命令1
elif [ 条件2 ]; then命令2
else命令3
fi
示例:判断成绩等级
#!/bin/bash
read -p "请输入成绩:" scoreif [ $score -ge 90 ]; thenecho "等级:A"
elif [ $score -ge 80 ]; thenecho "等级:B"
elif [ $score -ge 70 ]; thenecho "等级:C"
elseecho "等级:D"
fi

四、case 多分支选择语句

当条件较多时,caseif-elif 更清晰、高效。

✅ 语法结构

case 变量 in模式1)命令1;;模式2)命令2;;*)默认命令;;
esac

⚠️ * 表示默认匹配,;; 表示结束当前分支。

示例:菜单选择
#!/bin/bash
echo "请选择操作:"
echo "1) 查看日期"
echo "2) 查看磁盘使用"
echo "3) 查看内存使用"
read -p "输入选项:" choicecase $choice in1)date;;2)df -h;;3)free -h;;*)echo "无效选项";;
esac

五、for 循环语句

for 循环用于重复执行一组命令。

✅ 1. 遍历列表(字符串或数组)

for 变量 in 列表; do命令
done
示例:遍历文件名
#!/bin/bash
for file in *.txt; doecho "处理文件: $file"
done
示例:遍历数组
names=("Alice" "Bob" "Charlie")
for name in "${names[@]}"; doecho "Hello, $name"
done

✅ 2. C 风格 for 循环

for (( 初始化; 条件; 更新 )); do命令
done
示例:打印 1 到 5
#!/bin/bash
for (( i=1; i<=5; i++ )); doecho "第 $i 次循环"
done

六、while 和 until 循环

✅ 1. while 循环(当条件为真时执行)

while [ 条件 ]; do命令
done
示例:读取文件每行
#!/bin/bash
while read line; doecho "$line"
done < /etc/passwd
示例:计数循环
i=1
while [ $i -le 3 ]; doecho "循环 $i"((i++))
done

✅ 2. until 循环(当条件为假时执行)

until [ 条件 ]; do命令
done
示例:直到用户输入 "quit"
#!/bin/bash
input=""
until [ "$input" = "quit" ]; doread -p "输入命令(quit退出):" inputecho "你输入了:$input"
done

七、break 和 continue 语句

✅ break:跳出当前循环

for i in {1..5}; doif [ $i -eq 3 ]; thenbreakfiecho $i
done
# 输出:1 2

✅ continue:跳过本次循环,进入下一次

for i in {1..5}; doif [ $i -eq 3 ]; thencontinuefiecho $i
done
# 输出:1 2 4 5

八、实际开发中的典型应用场景

✅ 场景1:批量处理日志文件

#!/bin/bash
for log in /var/log/*.log; doif [ -s "$log" ]; thengzip "$log"echo "已压缩:$log"elseecho "空文件跳过:$log"fi
done

✅ 场景2:服务状态监控

#!/bin/bash
while true; doif ! systemctl is-active --quiet nginx; thenecho "$(date): Nginx 服务已停止,正在重启..."systemctl restart nginxfisleep 10
done

九、流程控制语句对比表

语句用途适用场景
if条件判断简单或复杂条件分支
case多分支选择多个固定值判断(如菜单)
for遍历循环已知次数或列表
while条件循环不确定次数,依赖条件
until反向条件循环直到条件满足为止
break跳出循环异常退出或满足条件终止
continue跳过本次循环过滤某些情况

十、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.dtcms.com/a/336098.html

相关文章:

  • Mutually aided uncertainty
  • 5G NR PDCCH之速率匹配
  • 【数据结构】堆和二叉树详解——上
  • 神经网络中的梯度概念
  • 【杂谈】-以质代量:谷歌主动学习范式重构AI训练逻辑
  • 把 AI 变成“气味翻译官”——基于微型电子鼻的低功耗 VOC 实时识别系统
  • 13、系统设计
  • 何为“低空经济”?
  • DeepSider:免费使用顶级大模型、全方位AI赋能的浏览器插件
  • gitee 流水线+docker-compose部署 nodejs服务+mysql+redis
  • Effective C++ 条款46:需要类型转换时请为模板定义非成员函数
  • tauri2项目WindowConfig配置中titleBarStyle样式区别,仅macOS有效
  • 如何在Windows系统中更改用户名(中文转英文全流程)
  • Deepseek一体机
  • 视觉图像界面设计【QT-creator高级编程 - 01】图像显如何保证跟随主窗口变化,且保留必要的设定窗口
  • MiracleVision-美图旗下AI视觉大模型
  • 2001-2024年中国冬小麦30米分辨率种植分布数据集
  • 【Luogu】每日一题——Day20. P4366 [Code+#4] 最短路 (图论)
  • SWE-bench:真实世界软件工程任务的“试金石”
  • 2025年- H97-Lc205--23.合并k个升序链表(链表、小根堆、优先队列)--Java版
  • 【Python练习】097. 编写一个函数,实现简单的版本控制工具
  • C++ 标准模板库 (^^ゞ 致敬 STL 创始人 Alexander Stepanov
  • 基于Python的旅游推荐系统 Python+Django+Vue.js
  • 计算机网络 TCP三次握手、四次挥手超详细流程【报文交换、状态变化】
  • 工作中使用到的 TRPS 【Temporal Residual Pattern Similarity】和 K-sigma 算法
  • C++——特殊类设计 类型转换 IO流
  • Redis学习--集群 数据分片、哈希槽、集群配置、主从容错迁移、扩缩容
  • live555 rtsp server
  • 通达信【二板爆量涨停】副图/选股指标,首板次日继续强势封板,整合MACD和KDJ指标确保趋势向上,专注二板机会
  • 【计算机网络面试】TCP/IP网络模型有哪几层