Bash脚本任务ID匹配正则问题及重复执行修复求助
修复Bash任务脚本的正则与逻辑问题
核心问题定位
- 单个任务ID匹配失败:原正则未正确捕获独立的单个
[a-z]字符(比如a),导致执行build.sh a时无任务触发。 - 多任务拼接拆分错误:原逻辑未正确分割拼接的任务ID(比如
ab被误判为单个任务而非a+b),导致仅执行第一个任务。 - 重复执行问题:未对任务(及子任务)去重,当传入包含父任务+子任务的组合(比如
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
相关产品推荐
相关产品推荐

