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
额外优化建议
用
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增加日志文件检查:避免日志文件不存在时
grep报错,可以加个前置判断:if [ ! -f "mylog.txt" ]; then echo "ERROR: Log file mylog.txt not found!" exit 1 fi
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

