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

Bash脚本任务ID匹配正则问题及重复执行修复求助

修复Bash任务脚本的正则与逻辑问题

核心问题定位

  1. 单个任务ID匹配失败:原正则未正确捕获独立的单个[a-z]字符(比如a),导致执行build.sh a时无任务触发。
  2. 多任务拼接拆分错误:原逻辑未正确分割拼接的任务ID(比如ab被误判为单个任务而非a+b),导致仅执行第一个任务。
  3. 重复执行问题:未对任务(及子任务)去重,当传入包含父任务+子任务的组合(比如aa1)时,子任务会被父任务的全量执行+单独执行触发两次。

修复步骤

1. 替换为正确的任务ID拆分正则

使用优先匹配长任务ID的正则逻辑,先捕获[a-z][0-9]+格式的特定子任务,再捕获单个[a-z]的全量任务,确保拼接的ID被正确拆分:

# 正确拆分任务ID的循环逻辑
TASK_IDS=()
while [[ "$1" =~ ^([a-z][0-9]+|[a-z])(.*)$ ]]; do
    TASK_IDS+=("${BASH_REMATCH[1]}")
    1="${BASH_REMATCH[2]}"
done

这个循环会从左到右逐个拆分合法任务:

  • 优先匹配[a-z][0-9]+(比如a1),避免被错误拆分为a+1(1不是合法任务)
  • 再匹配单个[a-z]字符(比如a)
  • 直到所有输入字符处理完毕

2. 实现任务去重与优先级处理

因为全量任务(比如a)已经包含其所有子任务(比如a1、a2),需过滤重复任务:

# 去重逻辑:移除被全量任务覆盖的子任务
FILTERED_TASKS=()
FULL_TASKS=()

# 先收集所有全量任务(单个字母)
for task in "${TASK_IDS[@]}"; do
    if [[ "$task" =~ ^[a-z]$ ]]; then
        FULL_TASKS+=("$task")
    fi
done

# 过滤子任务:如果子任务前缀在全量任务列表中,则跳过
for task in "${TASK_IDS[@]}"; do
    if [[ "$task" =~ ^([a-z])[0-9]+$ ]]; then
        PREFIX="${BASH_REMATCH[1]}"
        if [[ ! " ${FULL_TASKS[@]} " =~ " $PREFIX " ]]; then
            FILTERED_TASKS+=("$task")
        fi
    else
        # 全量任务只保留一次(避免重复传入aa的情况)
        if [[ ! " ${FILTERED_TASKS[@]} " =~ " $task " ]]; then
            FILTERED_TASKS+=("$task")
        fi
    fi
done

3. 任务执行逻辑优化

按预定义顺序执行任务,同时记录总耗时:

# 预定义任务执行顺序(可灵活新增/调整)
PREDEFINED_ORDER=("a" "a1" "a2" "b" "b1" "c")

# 记录开始时间
START_TIME=$(date +%s)

# 按预定义顺序执行过滤后的任务
for ordered_task in "${PREDEFINED_ORDER[@]}"; do
    # 执行单个特定任务
    if [[ " ${FILTERED_TASKS[@]} " =~ " $ordered_task " ]]; then
        echo "执行任务: $ordered_task"
        # 替换为实际任务执行逻辑,比如调用对应脚本
        # ./tasks/${ordered_task}.sh
        sleep 1 # 示例模拟耗时
    # 执行全量任务的所有子任务
    elif [[ "$ordered_task" =~ ^[a-z]$ ]]; then
        if [[ " ${FULL_TASKS[@]} " =~ " $ordered_task " ]]; then
            echo "执行全量任务: $ordered_task(包含所有子任务)"
            # 遍历预定义顺序中该前缀的所有子任务
            for subtask in "${PREDEFINED_ORDER[@]}"; do
                if [[ "$subtask" =~ ^${ordered_task}[0-9]+$ ]]; then
                    echo "  执行子任务: $subtask"
                    # ./tasks/${subtask}.sh
                    sleep 0.5 # 示例模拟耗时
                fi
            done
        fi
    fi
done

# 计算并显示总耗时
END_TIME=$(date +%s)
ELAPSED=$((END_TIME - START_TIME))
echo "总执行耗时: ${ELAPSED}秒"

测试验证

  • 执行build.sh a:触发a的所有子任务,无遗漏
  • 执行build.sh ab:按顺序执行a的全量任务 + b的全量任务
  • 执行build.sh aa1:仅执行a的全量任务(包含a1),不会重复执行a1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:55:31