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

BASH脚本CASE语句多变量处理扩展及st文件适配技术问询

Got it!我来帮你扩展这个BASH脚本里的CASE语句逻辑。先从现有基础出发,再给你几个实用的扩展方向和代码示例,你可以按需调整:

1. 先回顾原有基础脚本结构

假设你现有的脚本大概是这样的(读取每行并匹配基础状态):

#!/bin/bash

# 读取st文件的每行内容,解析到对应变量
while IFS='"' read -r _ status _ name _ startdate _ enddate _; do
    # 原有CASE匹配逻辑
    case "$status" in
        "aborted")
            echo "任务 $name 已终止,开始时间:$startdate,结束时间:$enddate"
            ;;
        "failed")
            echo "任务 $name 执行失败,开始时间:$startdate,结束时间:$enddate"
            ;;
        "succeeded")
            echo "任务 $name 执行成功,开始时间:$startdate,结束时间:$enddate"
            ;;
        *)
            echo "未知状态:$status,任务名称:$name"
            ;;
    esac
done < "your_file.st"
2. 实用的CASE逻辑扩展方向

下面是几种常见且实用的扩展方案,你可以单独或组合使用:

扩展示例1:添加状态统计+失败任务日志

给每种状态做计数统计,同时把失败任务单独写入日志文件,方便后续排查:

#!/bin/bash

# 初始化状态计数器
declare -i aborted_cnt=0 failed_cnt=0 succeeded_cnt=0 unknown_cnt=0
# 失败任务日志文件(提前清空旧内容)
failed_log="./failed_tasks.log"
> "$failed_log"

while IFS='"' read -r _ status _ name _ startdate _ enddate _; do
    case "$status" in
        "aborted")
            echo "⚠️ 任务 $name 已终止 | 开始:$startdate | 结束:$enddate"
            ((aborted_cnt++))
            ;;
        "failed")
            echo "❌ 任务 $name 执行失败 | 开始:$startdate | 结束:$enddate"
            ((failed_cnt++))
            # 写入失败任务详情到日志
            echo "$(date +'%Y-%m-%d %H:%M:%S') - 失败任务:$name,时间范围:$startdate → $enddate" >> "$failed_log"
            # 可选:触发重试逻辑(比如调用重试脚本)
            # ./retry_task.sh "$name" "$startdate"
            ;;
        "succeeded")
            echo "✅ 任务 $name 执行成功 | 开始:$startdate | 结束:$enddate"
            ((succeeded_cnt++))
            ;;
        *)
            echo "❓ 未知状态:$status | 任务名称:$name"
            ((unknown_cnt++))
            ;;
    esac
done < "your_file.st"

# 输出最终统计结果
echo -e "\n=== 任务执行统计汇总 ==="
echo "已终止任务:$aborted_cnt 个"
echo "执行失败任务:$failed_cnt 个(详情查看 $failed_log)"
echo "执行成功任务:$succeeded_cnt 个"
echo "未知状态任务:$unknown_cnt 个"

扩展示例2:格式化ISO时间为本地时区

把原始的ISO格式时间(如2018-04-03T17:43:38Z)转成本地时区的可读性格式:

while IFS='"' read -r _ status _ name _ startdate _ enddate _; do
    # 转换时间格式为本地时区的"年-月-日 时:分:秒"
    local_start=$(date -d "$startdate" '+%Y-%m-%d %H:%M:%S')
    local_end=$(date -d "$enddate" '+%Y-%m-%d %H:%M:%S')

    case "$status" in
        "aborted")
            echo "任务 $name 已终止 | 本地开始时间:$local_start | 本地结束时间:$local_end"
            ;;
        "failed")
            echo "任务 $name 执行失败 | 本地开始时间:$local_start | 本地结束时间:$local_end"
            ;;
        "succeeded")
            echo "任务 $name 执行成功 | 本地开始时间:$local_start | 本地结束时间:$local_end"
            ;;
        *)
            echo "未知状态:$status | 任务名称:$name"
            ;;
    esac
done < "your_file.st"

扩展示例3:针对关键任务的特殊告警

如果某些特定任务(比如名称包含backup或db_sync)失败时需要触发告警,可以在CASE里嵌套判断:

case "$status" in
    "failed")
        echo "❌ 任务 $name 执行失败 | 开始:$startdate | 结束:$enddate"
        # 针对备份/数据库同步任务发送邮件告警
        if [[ "$name" == *"backup"* || "$name" == *"db_sync"* ]]; then
            echo "紧急告警:核心任务 $name 执行失败!时间范围:$startdate → $enddate" | mail -s "核心任务失败告警" admin@yourdomain.com
        fi
        ;;
    # 其他状态处理逻辑...
esac

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:50:08