如何规避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
重构思路说明
- 封装重复逻辑为函数:把两次重复的重试计数、提示输出、重试次数判断、睡眠/继续逻辑都整合到
handle_retry函数中,避免代码冗余。 - 用参数适配场景差异:
- 第一个参数传递不同场景的错误提示文本,适配两种重试场景的提示差异。
- 第二个可选参数控制是否打印
CS2变量内容,满足第一次重试需要打印、第二次不需要的需求,默认设为0。
- 变量作用域控制:函数内部用
local定义局部变量,避免污染全局上下文;全局的retry_cnt、max_retry_cnt等变量可直接在函数中使用,贴合脚本的运行逻辑。
这种修改后,后续如果要调整重试规则(比如修改睡眠时间、更新错误提示格式),只需修改handle_retry函数即可,无需在多个位置重复修改,大幅提升脚本的可维护性。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

