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
相关产品推荐
相关产品推荐

