在编写 Linux Shell 脚本 时,循环结构(如 for、while)是实现重复任务的核心工具。然而,如果循环中出现错误(比如文件不存在、命令执行失败等),脚本可能会崩溃或产生不可预知的结果。因此,学会在循环中进行错误处理至关重要。
本文将从零开始,用通俗易懂的方式教你如何在 Shell 循环中捕获和处理错误,确保你的脚本更加健壮可靠。无论你是刚接触 Linux 的新手,还是有一定经验的用户,都能从中受益。

假设你写了一个 for 循环来批量处理日志文件:
for file in *.log; do gzip "$file"done但如果当前目录下没有 .log 文件,*.log 会原样保留为字符串 *.log,导致 gzip *.log 报错。更糟的是,如果某个文件正在被其他程序占用,压缩也可能失败。
这时候,如果没有错误处理机制,整个脚本可能中断,或者继续执行但留下隐患。因此,我们需要主动检测并应对这些异常情况。
在 Bash 中,每个命令执行后都会返回一个退出状态码(exit status):
0 表示成功0(通常是 1~255)表示失败你可以通过特殊变量 $? 获取上一条命令的退出状态:
ls /nonexistentecho "Exit code: $?"输出可能是:Exit code: 2,说明命令失败了。
for file in *.log; do if [ -f "$file" ]; then echo "Processing $file..." gzip "$file" if [ $? -eq 0 ]; then echo "✅ $file compressed successfully." else echo "❌ Failed to compress $file!" fi else echo "⚠️ No .log files found or invalid filename." fidone这里我们先用 [ -f "$file" ] 检查文件是否存在且为普通文件,再执行压缩,并根据 gzip 的退出状态决定输出成功还是失败信息。
你可以在脚本开头加上 set -e,这样只要任何命令返回非零状态,脚本就会立即退出:
#!/bin/bashset -efor file in *.log; do gzip "$file"done但这种方法过于“激进”,不适合需要部分失败仍继续执行的场景。建议在循环内部做精细控制。
Bash 支持逻辑操作符:
command1 && command2:只有 command1 成功才执行 command2command1 || command2:只有 command1 失败才执行 command2for file in *.log; do [ -f "$file" ] && gzip "$file" || echo "Skipping invalid file: $file"done这种方式简洁,但可读性稍差,适合简单场景。
下面是一个带完整错误处理的日志清理脚本:
#!/bin/bashLOG_DIR="/var/log/myapp"DAYS_OLD=7if [ ! -d "$LOG_DIR" ]; then echo "❌ Log directory does not exist: $LOG_DIR" exit 1fi# 查找并删除超过7天的日志文件find "$LOG_DIR" -name "*.log" -type f -mtime +$DAYS_OLD | while read -r file; do if rm -f "$file"; then echo "🗑️ Deleted old log: $file" else echo "❗ Failed to delete: $file" fidone这个脚本不仅检查目录是否存在,还在删除每个文件时判断是否成功,避免因权限问题导致静默失败。
"$file" 防止空格或特殊字符引发错误。nullglob 选项)。trap 捕获信号做清理工作。通过本文的学习,你应该已经掌握了在 Linux Shell 循环 中进行错误处理的基本方法。无论是简单的 if 判断,还是结合 ||、&& 的快捷写法,核心思想都是:不要假设一切都会顺利。
记住,一个健壮的脚本不仅要能完成任务,还要能在异常情况下优雅地应对。希望这篇教程能帮助你在 bash脚本调试 和 bash循环异常 处理方面更进一步!
本文由主机测评网于2025-11-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/202511648.html