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
执行结果:
[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
稳步前行,只争朝夕。
浙公网安备 33010602011771号