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

如何规避Shell脚本中重复的重试逻辑代码?

解决Shell脚本中重试逻辑代码重复的方案

在Shell脚本中,消除代码重复最实用的方式是把重复逻辑封装为函数,通过参数传递不同场景的差异内容,既能减少冗余,也方便后续维护修改。

重构后的完整脚本

# 定义重试处理函数,封装重复逻辑
handle_retry() {
    local error_msg="$1"
    local print_cs2="${2:-0}"  # 可选参数,默认不打印CS2内容

    (( retry_cnt += 1 ))
    # 根据参数决定是否打印CS2
    if [[ $print_cs2 -eq 1 ]]; then
        echo "$CS2"
    fi
    echo "$error_msg retry, retry_cnt=$retry_cnt"
    
    # 判断是否超出最大重试次数
    if [[ $retry_cnt -gt $max_retry_cnt ]]; then
        echo "$RED retry too many times, failed to write 0xe2 $bytes 2 $filename $RESET"
        break
    fi
    sleep 0.5
    continue
}

# Loop through each filename in sorted_files and print it
set -- $sorted_files
for filename; do
    addr=$(echo "$filename" | cut -d_ -f1)
    bytes=$(echo "$filename" | cut -d_ -f2 | sed -e 's/B.dat//' -e 's/KB.dat//')
    
    retry_cnt=0;
    while true; 
    do
        echo "bulk writing 0xe2 $bytes 2 $filename"
        ccidbgr /dev/cci2 0x6d bulkWrite 0xe2 $bytes 2 $filename
        sleep 0.5
        echo "reading CS2"
        CS2=$(ccidbgr /dev/cci2 0x6d read 0xF2 2>&1)
        
        # 调用函数处理重试逻辑,传递错误提示和打印CS2的参数
        if [[ $? -ne 0 ]]; then
            handle_retry "reading CS2 checking failed." 1
        fi
        
        echo $CS2
        CS2=$(echo $CS2 | cut -dx -f3)
        
        # 调用函数处理重试逻辑,仅传递错误提示
        if [[ $CS2 -eq 0 ]]; then
            handle_retry "read CS2 is zero."
        fi
    done
done

重构思路说明

  1. 封装重复逻辑为函数:把两次重复的重试计数、提示输出、重试次数判断、睡眠/继续逻辑都整合到handle_retry函数中,避免代码冗余。
  2. 用参数适配场景差异:
    • 第一个参数传递不同场景的错误提示文本,适配两种重试场景的提示差异。
    • 第二个可选参数控制是否打印CS2变量内容,满足第一次重试需要打印、第二次不需要的需求,默认设为0。
  3. 变量作用域控制:函数内部用local定义局部变量,避免污染全局上下文;全局的retry_cnt、max_retry_cnt等变量可直接在函数中使用,贴合脚本的运行逻辑。

这种修改后,后续如果要调整重试规则(比如修改睡眠时间、更新错误提示格式),只需修改handle_retry函数即可,无需在多个位置重复修改,大幅提升脚本的可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:17