continue本身不跳过错误数据,而是配合if判断或命令返回值(如[ -f "$file" ] || continue)在检测异常时主动跳过当前迭代,适用于for/while/until循环。

在 Shell 脚本中,continue 本身不能“跳过错误数据”,它只是跳过当前循环迭代的剩余部分,直接进入下一次循环。真正实现“跳过错误数据”的关键在于:**先判断数据是否出错,再用 continue 主动跳过**。
用 if 判断 + continue 跳过异常项
这是最常用也最清晰的做法。比如遍历文件列表,遇到不存在或无读取权限的文件就跳过:
for file in *.log; do
[ -f "$file" ] || { echo "跳过非普通文件: $file"; continue; }
[ -r "$file" ] || { echo "跳过不可读文件: $file"; continue; }
# 正常处理逻辑,例如统计行数
wc -l "$file"
done说明:
• [ -f "$file" ] 检查是否为普通文件,失败则执行 continue
• || 后的命令块只在前一个命令退出码非 0 时执行
• continue 必须写在循环体内,且只能用于 for、while、until
配合命令返回值做条件跳过
很多命令(如 grep、awk、jq)执行失败会返回非零退出码,可直接利用:
- 过滤掉不含关键字段的行:
grep -q 'ERROR' "$line" || continue - 解析 JSON 失败时跳过:
jq -e '.status == "ok"' "$json" >/dev/null || continue - 避免因空行或格式错误中断:
[ -n "$line" ] && [[ "$line" =~ ^[0-9]+$ ]] || continue
在 while read 中安全跳过脏数据
逐行读取时,空行、注释、格式错误都可能干扰处理:
while IFS= read -r line; do
# 跳过空行和以 # 开头的注释
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
# 跳过字段数不足的行(假设需至少 2 字段)
set -- $line; [ $# -lt 2 ] && continue
echo "处理有效行: $line"
done < config.txt注意:
• IFS= 防止行首尾空格被 trim
• read -r 避免反斜杠转义
• 条件判断放在 continue 前,确保逻辑清晰
避免常见陷阱
continue 不是万能的“错误恢复”机制,这些情况要特别注意:
- 不要在
if外层直接写continue—— 它必须位于循环体内部 - 不要依赖命令的 stdout 判断成败,而要看其
$?或用&&/||控制流 - 在管道中,
continue只对当前 shell 层生效;子 shell(如cmd | while read)里的continue不影响外层循环 - 调试时加
echo "跳过: $data"能快速定位哪些数据被过滤

















