You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BASH while循环未重新检查文件问题求助

问题分析与解决思路

兄弟,你的问题根源一眼就能看出来——日志状态的读取逻辑放在了循环外面!

你一开始就计算好了failed和skipped的初始值,之后整个while循环里都在复用这两个固定值,完全没有去重新读取日志文件的最新内容。哪怕重试过程中日志已经更新成正常状态,循环也根本感知不到,只会一直用最开始的旧判断结果。

修正后的代码

把日志检查的逻辑移到循环内部,让每次重试都重新获取最新的日志状态就搞定了,我给你调整后的代码:

max_retries="5"
backup_count="1"

while (( max_retries >= backup_count ))
do
    # 关键修改:每次循环都重新读取日志的最新状态
    failed=$(grep -c "Transfer failed: 0" "mylog.txt")
    skipped=$(grep -c "Transfer skipped: 0" "mylog.txt")

    if (( skipped == 1 && failed == 1 )); then
        echo "BACKUP IS GOOD"
        exit 0
    else
        echo "BACKUP IS NOT GOOD - Retry $backup_count of $max_retries"
        sleep 15
        (( backup_count++ ))
    fi
done

# 循环结束仍未成功时的提示
echo "BACKUP FAILED AFTER $max_retries RETRIES"
exit 1

额外优化建议

  1. 用grep -q提升效率:如果只是判断是否存在匹配内容,不需要精确计数的话,用-q选项会更高效(它找到匹配就立刻停止,不用遍历整个文件):

    while (( max_retries >= backup_count ))
    do
        if grep -q "Transfer failed: 0" "mylog.txt" && grep -q "Transfer skipped: 0" "mylog.txt"; then
            echo "BACKUP IS GOOD"
            exit 0
        else
            echo "BACKUP IS NOT GOOD - Retry $backup_count of $max_retries"
            sleep 15
            (( backup_count++ ))
        fi
    done
    
  2. 增加日志文件检查:避免日志文件不存在时grep报错,可以加个前置判断:

    if [ ! -f "mylog.txt" ]; then
        echo "ERROR: Log file mylog.txt not found!"
        exit 1
    fi
    

内容的提问来源于stack exchange,提问作者Jerome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:33:51