汕尾市网站建设_网站建设公司_轮播图_seo优化
2025/12/25 11:24:38 网站建设 项目流程

Shell脚本——生成sa文件名

#!/bin/bash
###############################################
# 功能:
# 函数
Check_Days()判断闰年和平年,计算每月天数;
# 函数SaLog_Name()生成sa日志1-9日文件名和10-31日文件名;
# 判断当月和跨月:if (( $Startday < $Lastday )); then 调用函数并生成sa日志文件名;
#
#输出打印sa日志文件路径

  # [root@sysmt TestScripts]# sh for.sh
  # 请输入年份(如 起始日期:1-31,直接回车默认 1): 1
  # 请输入月份(如 结束日志:1-31,直接回车默认 1): 5
  # 1.生成当月sa文件:/var/log/sa/sa01
  # 2.生成当月sa文件:/var/log/sa/sa02
  # 3.生成当月sa文件:/var/log/sa/sa03
  # 4.生成当月sa文件:/var/log/sa/sa04
  # 5.生成当月sa文件:/var/log/sa/sa05

###############################################

 
# 数组起始位
let "j=0"

# 当月年份
Year=$(date "+%Y")
# 当月月份
Month=$(date "+%m")
# 当月日期
Day=$(date "+d")

Check_Days() {
    local File_Year=$1
    local File_Month=$2
    local flags=$3

    # 1. 判断闰年
    if (( File_Year%4==0 && (File_Year%100!=0 || File_Year%400==0) )); then
        # 判断闰年,变量Leap_Year为"1"
        Leap_Year=1
    else
        # 判断平年,变量Leap_Year为"0"
        Leap_Year=0
    fi

    # 计算跨月月份
    if (( flags == 1 )); then
        let "File_Month=File_Month-1"
    fi

    # 2. 再按月份给天数
    case $File_Month in
        1|3|5|7|8|10|12) days=31 ;;
        4|6|9|11)        days=30 ;;
        2)               days=$(( Leap_Year ? 29 : 28 )) ;;
        *)               echo "月份输入错误"; return 1 ;;
    esac
    # # 3. 输出结果
    # if (( Leap_Year )); then
    #     echo "$File_Year 年是闰年,$File_Month 月有 $days 天。"
    # else
    #     echo "$File_Year 年是平年,$File_Month 月有 $days 天。"
    # fi
    printf '%d\n' "$days"
}

SaLog_Name() {
    if (( $2 <= 9 )); then
        # 1-9日sar日志文件路径
        logfile[$1]="/var/log/sa/sa0$2"
    else
        # 10-31日sar日志文件路径
        logfile[$1]="/var/log/sa/sa$2"
    fi
}

# ------------- 交互部分 -------------
read -p "请输入年份(如  起始日期:1-31,直接回车默认 1): " Startday
read -p "请输入月份(如 结束日志:1-31,直接回车默认 1): " Lastday

Startday=${Startday:-1}
Lastday=${Lastday:-1}


# 判断一:当月sa日志
# 条件1:$Startday小于$Lastday,用for循环顺序读取日期编号,生成sa文件名;
# 判断二:跨月sa日志(当年跨月和跨年跨月)
# 条件1:$Startday大于$Lastday,为跨月sa日志;
# 条件2.1:当月$Month为2025年2-12月,计算本年度上月月份LastMonth=$Month-1为1-11,通过函数Check_Days()获取上月最大天数;
# 条件2.2:当月$Month为2025年1月,计算跨年上月月份LastMonth=$Month-1为0,即上年度12月重新赋值LastMonth=12,通过函数Check_Days()获取上月最大天数;
# 变量Startday:$Startday记录开始日期;
# 变量Lastday:$Lastday记录结束日期;
# 生成Sa文件名,通过“j=j+1”累计存放到数组SaFileName[j];
if (( $Startday < $Lastday )); then
    # 生成当月sa文件
    for This_Month_Day in $(seq $Startday $Lastday)
    do
        SaLog_Name $j $This_Month_Day
        echo "$((j+1)).生成当月sa文件:${logfile[$j]}"
        # 记录文件数量
        let "j=j+1"
    done
else
    # 生成跨月sa文件(两部分文件:上月sa文件和当月sa文件)
    # File_Year=$(stat /var/log/sa/sa04 | awk -F'[ -]' '/Modify/ {print $2}')
    # File_Month=$(stat /var/log/sa/sa04 | awk -F'[:-]' '/Modify/ {print $3}')
    # 函数Check_Days传参(例如:今年:2025,当月:12)

    # 跨月标记flags=1,函数Check_Days()中计算上月月份
    flags=1
    Days=$(Check_Days $Year $Month $flags)

    while true; do
        if (( ($Startday+$j) <= $Days )); then
            # 数组记录上月sa日志文件名称
            for LastMonth_day in $(seq $Startday $Days)
            do
                SaLog_Name $j $LastMonth_day
                echo "$((j+1)).生成跨月sa文件路径 ${logfile[$j]}"
                # 记录文件数量
                let "j=j+1"
            done
        else
            # 数组记录当月sa日志文件名称
            for ThisMonth_day in $(seq 1 $Lastday)
            do
                SaLog_Name $j $ThisMonth_day
                echo "$((j+1)).生成跨月sa文件路径 ${logfile[$j]}"
                # 记录文件数量
                let "j=j+1"
            done
            break
        fi
    done
fi

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询