Shell 脚本流程控制指南:条件判断与循环详解

发布时间:2026/11/2 21:08:29
Shell 脚本流程控制指南:条件判断与循环详解 Shell 脚本流程控制完全指南条件判断与循环详解最近学了些 Shell 脚本中的结构化命令涵盖条件判断if、case与各类循环for、while、until以及循环控制break、continue和实际应用场景。作为平时 Shell 编程的速查手册。一、条件判断1.1 if 语句if是 Shell 中最基础的条件判断结构。基本语法ifconditionthenstatementsficondition 为判断条件返回 true 则执行 then 后的语句必须以 fi 闭合if 倒写因此即使有多条语句也不需要 {} 包裹if-else 示例#!/bin/bashreadareadbif(($a$b))thenechoa 和 b 相等elseechoa 和 b 不相等输入错误fiif-elif-else 示例ifcondition1thenstatement1elifcondition2thenstatement2elifcondition3thenstatement3...elsestatementNfi⚠️ 注意if 和 elif 后面都必须跟着 then。嵌套 ifif[测试条件成立]then执行相应命令if[测试条件成立]then执行相应命令fifi1.2 case 语句case 是多分支选择结构适合对单个变量进行多值匹配。基本语法caseexpressioninpattern1)statement1;;pattern2)statement2;;pattern3|pattern4)statement3;;*)default statement;;esac要点使用 | 可在同一行分隔多个匹配模式*星号 作为通配符捕获所有未匹配的值每个分支以 ;; 结束示例case$USERinrich|barbara)echoWelcome$USERechoPlease enjoy your visit;;testing)echoSpecial testing account;;jessica)echoDo not forget to log off when youre done;;*)echoSorry, you are not allowed here;;esac二、循环结构2.1 for 循环for 用于遍历一系列值每次迭代使用其中一个值执行命令组。基本语法forvarinlistdocommandsdone可将 do 与 for 放在同一行但需用分号分隔for var in list; do示例#!/bin/bashforiteminGuangdong Sichuan Henan Heilongjiang Zhejiang JiangsudoechoThe next province is$itemdone注意事项for 默认假定每个值以空格分隔值含特殊字符时需转义双引号包裹的值不会被 Shell 当作值的一部分从命令读取值使用命令替换生成列表fileprovincesforprovincein$(cat$file)doechoVisit beautiful$provincedone文件 provinces.txt 中每行一个省份。若值含空格仍会被拆分为多个字段。更改字段分隔符IFSIFSInternal Field Separator定义了 Shell 的字段分隔符默认为空格、制表符、换行符。临时修改 IFS 以处理含空格的数据fileprovincesIFS$\nforprovincein$(cat$file)doechoVisit beautiful$provincedone2.2 while 循环while 在每次迭代开始时测试条件返回退出状态码 0 则继续执行。基本语法whiletestcommanddoother commandsdone示例var110while[$var1-gt0]doecho$var1var1$[$var1-1]done⚠️ 循环体内必须修改测试条件中的变量否则将陷入死循环。2.3 until 循环until 与 while 工作方式相反只要测试命令返回非零退出状态码就继续执行循环返回 0 时循环结束。基本语法untiltestcommanddoother commandsdone示例#!/bin/bashnum100until[$num-eq0]doecho$numnum$[$num-25]done三、循环控制3.1 break 命令用于退出循环支持指定跳出层级。跳出当前循环fornumin12345678910doif[$num-eq5]thenbreakfiechoIteration number:$numdoneechoThe for loop is completed跳出多层循环breakn# n 指定跳出的循环层级默认为 1#!/bin/bashfor((a1;a4;a))doechoOuter loop:$afor((b1;b100;b))doif[$b-gt4]thenbreak2# 跳出外层循环fiechoInner loop:$bdonedone3.2 continue 命令跳过当前迭代中剩余命令但不终止整个循环。#!/bin/bashfor((num1;num15;num))doif[$num-gt5][$num-lt10]thencontinuefiechoIteration number:$numdone⚠️ 在 while 和 until 中使用 continue 时需格外小心确保不会跳过变量增值语句否则可能导致死循环。四、嵌套循环循环内可以嵌套任意类型的命令包括其他循环。注意迭代次数是乘积关系。#!/bin/bashfor((a1;a3;a))doechoStarting loop$afor((b1;b3;b))doecho Inside loop:$bdonedonewhile 内嵌 for#!/bin/bashnum15while[$num1-ge0]doechoOutput loop:$num1for((num21;num23;num2))donum3$[$num1*$num2]echo Inner loop:$num1*$num2$num3donenum1$[$num1-1]done五、处理循环输出可在 done 后添加管道或重定向处理整个循环的输出。forfilein/home/rich/*doif[-d$file]thenecho$fileis a directoryelif[-f$file]thenecho$fileis a filefidoneoutput.txt总结速查表命令用途关键记忆点if条件判断以fi结尾支持嵌套case多分支匹配*)为默认分支;;结束for遍历列表支持列表、命令替换、通配符、C风格while当条件成立时循环条件为真0时执行until当条件不成立时循环条件为假非0时执行break退出循环break n可跳出 n 层循环continue跳过本次迭代注意避免死循环

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询