在 Shell 脚本的 for、while、until 循环中,有时不需要执行完所有迭代,而是要提前终止循环,或者跳过当前这一次循环直接进入下一次。Shell 为此提供了 break 和 continue 两个内建命令。此外,exit 则是用来直接退出整个脚本。它们在日常脚本中非常实用,下面逐个说明。
1. break:立即跳出循环
当某个条件满足时,使用 break 可以直接终止当前所在的整个循环,不再执行剩余的任何迭代。常用来实现“找到了就停”的逻辑。
# 在 1~10 中查找第一个能被 3 和 5 同时整除的数
for i in $(seq 1 10); do
if [ $((i % 3)) -eq 0 ] && [ $((i % 5)) -eq 0 ]; then
echo "找到了: $i"
break # 找到后就退出循环,不再检查后面的数
fi
done
如果有多层循环嵌套,break 默认只跳出最内层循环。可以使用 break N 指定跳出几层,例如 break 2 会跳出两层循环。
2. continue:跳过本次迭代,进入下一次循环continue 用来结束当前这一次循环的执行,直接回到循环开始进行下一轮判断和迭代。常用于忽略某些不需要处理的情况。
# 打印 1~10 中的所有偶数
for i in $(seq 1 10); do
if [ $((i % 2)) -ne 0 ]; then
continue # 奇数就跳过,不执行后面的 echo
fi
echo "$i 是偶数"
done
和 break 类似,continue 也可以带层数参数 continue N,在多级嵌套中从多层循环内直接跳到外层循环的下一次迭代。
3. exit:立即退出整个脚本exit 并不局限于循环内部,它可以出现在脚本的任何位置。执行时,脚本立即终止,并可以返回一个退出状态码(默认是 0 表示成功,非零表示异常)。在循环中碰到致命错误需要提前结束整个脚本时,可以使用 exit。
# 检查日志文件是否存在,不存在则退出脚本
if [ ! -f "/var/log/app.log" ]; then
echo "错误: 日志文件不存在"
exit 1
fi
for line in $(cat /var/log/app.log); do
if [ "$line" = "FATAL" ]; then
echo "发现致命错误,脚本中止"
exit 2 # 立即停止脚本,退出码为2
fi
done
4. 实践中的区别与应用场景
- 当你需要提前结束整个循环(例如搜索到目标后不再继续),用
break。 - 当你需要跳过某一次循环中的剩余代码,但还要继续执行后面的循环,用
continue。 - 当你遇到无法继续执行整个脚本的错误条件,无论当前是否在循环中,都用
exit。
这三个命令配合循环和条件判断,让 Shell 脚本能够写出清晰、高效的控制流程。特别是在处理大量文件、日志分析或执行任务轮询时,合理运用它们可以大大减少不必要的处理,提升脚本的健壮性和执行效率。