☰
Shell 脚本流程控制指南:条件判断与循环详解
2026/10/13 18:10:01 网站建设 项目流程

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

最近学了些 Shell 脚本中的结构化命令,涵盖条件判断(if、case)与各类循环(for、while、until),以及循环控制(break、continue)和实际应用场景。作为平时 Shell 编程的速查手册。


一、条件判断

1.1 if 语句

if是 Shell 中最基础的条件判断结构。

基本语法:

ifconditionthenstatementsfi
  • condition 为判断条件,返回 true 则执行 then 后的语句
  • 必须以 fi 闭合(if 倒写),因此即使有多条语句也不需要 {} 包裹

if-else 示例:

#!/bin/bashreadareadbif(($a==$b))thenecho"a 和 b 相等"elseecho"a 和 b 不相等,输入错误"fi

if-elif-else 示例:

ifcondition1thenstatement1elifcondition2thenstatement2elifcondition3thenstatement3...elsestatementNfi

⚠️ 注意:if 和 elif 后面都必须跟着 then。

嵌套 if:

if[测试条件成立]then执行相应命令if[测试条件成立]then执行相应命令fifi

1.2 case 语句

case 是多分支选择结构,适合对单个变量进行多值匹配。
基本语法:

caseexpressioninpattern1)statement1;;pattern2)statement2;;pattern3|pattern4)statement3;;*)default statement;;esac

要点:

  • 使用 | 可在同一行分隔多个匹配模式
  • *(星号) 作为通配符捕获所有未匹配的值
  • 每个分支以 ;; 结束

示例:

case$USERinrich|barbara)echo"Welcome$USER"echo"Please enjoy your visit";;testing)echo"Special testing account";;jessica)echo"Do not forget to log off when you're done";;*)echo"Sorry, you are not allowed here";;esac

二、循环结构

2.1 for 循环

for 用于遍历一系列值,每次迭代使用其中一个值执行命令组。
基本语法:

forvarinlistdocommandsdone

可将 do 与 for 放在同一行,但需用分号分隔:for var in list; do

示例

#!/bin/bashforiteminGuangdong Sichuan Henan Heilongjiang Zhejiang Jiangsudoecho"The next province is$item"done

注意事项:

  • for 默认假定每个值以空格分隔
  • 值含特殊字符时需转义
  • 双引号包裹的值不会被 Shell 当作值的一部分

从命令读取值
使用命令替换生成列表:

file="provinces"forprovincein$(cat$file)doecho"Visit beautiful$province"done

文件 provinces.txt 中每行一个省份。若值含空格,仍会被拆分为多个字段。

更改字段分隔符(IFS)
IFS(Internal Field Separator)定义了 Shell 的字段分隔符,默认为:空格、制表符、换行符。
临时修改 IFS 以处理含空格的数据:

file="provinces"IFS=$'\n'forprovincein$(cat$file)doecho"Visit beautiful$province"done

2.2 while 循环

while 在每次迭代开始时测试条件,返回退出状态码 0 则继续执行。
基本语法:

whiletestcommanddoother commandsdone

示例:

var1=10while[$var1-gt0]doecho$var1var1=$[$var1-1]done

⚠️ 循环体内必须修改测试条件中的变量,否则将陷入死循环。

2.3 until 循环

until 与 while 工作方式相反:只要测试命令返回非零退出状态码,就继续执行循环;返回 0 时循环结束。
基本语法:

untiltestcommanddoother commandsdone

示例:

#!/bin/bashnum=100until[$num-eq0]doecho$numnum=$[$num-25]done

三、循环控制

3.1 break 命令

用于退出循环,支持指定跳出层级。
跳出当前循环:

fornumin12345678910doif[$num-eq5]thenbreakfiecho"Iteration number:$num"doneecho"The for loop is completed"

跳出多层循环:

breakn# n 指定跳出的循环层级,默认为 1
#!/bin/bashfor((a=1;a<4;a++))doecho"Outer loop:$a"for((b=1;b<100;b++))doif[$b-gt4]thenbreak2# 跳出外层循环fiecho"Inner loop:$b"donedone

3.2 continue 命令

跳过当前迭代中剩余命令,但不终止整个循环。

#!/bin/bashfor((num=1;num<15;num++))doif[$num-gt5]&&[$num-lt10]thencontinuefiecho"Iteration number:$num"done

⚠️ 在 while 和 until 中使用 continue 时需格外小心,确保不会跳过变量增值语句,否则可能导致死循环。

四、嵌套循环

循环内可以嵌套任意类型的命令,包括其他循环。注意迭代次数是乘积关系。

#!/bin/bashfor((a=1;a<=3;a++))doecho"Starting loop$a"for((b=1;b<=3;b++))doecho" Inside loop:$b"donedone

while 内嵌 for:

#!/bin/bashnum1=5while[$num1-ge0]doecho"Output loop:$num1"for((num2=1;num2<3;num2++))donum3=$[$num1*$num2]echo" Inner loop:$num1*$num2=$num3"donenum1=$[$num1-1]done

五、处理循环输出

可在 done 后添加管道或重定向,处理整个循环的输出。

forfilein/home/rich/*doif[-d"$file"]thenecho"$fileis a directory"elif[-f"$file"]thenecho"$fileis a file"fidone>output.txt

总结速查表

命令用途关键记忆点
if条件判断以fi结尾,支持嵌套
case多分支匹配*)为默认分支,;;结束
for遍历列表支持列表、命令替换、通配符、C风格
while当条件成立时循环条件为真(0)时执行
until当条件不成立时循环条件为假(非0)时执行
break退出循环break n可跳出 n 层循环
continue跳过本次迭代注意避免死循环

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询