如何反转Bash脚本输出:按星期末归类对应月份
问题描述
现有一项作业任务,已有的Bash脚本可以列出指定年份(默认当前年)各月份对应的月末星期几:
#! /bin/bash y=$1 if [ -z $1 ] # if year is not specified use the current year then y=(`date +%Y`) fi for m in {1..12}; do if [ $m -eq 12 ] # december exception then echo $(date -d $m/1/$y +%b) - $(date -d "$(($m%12+1))/1/$y" +%A) break fi echo $(date -d $m/1/$y +%b) - $(date -d "$(($m%12+1))/1/$y - 1 days" +%A) # print the last day of the week for the month done
该脚本的输出示例为:
Jan - Monday Feb - Monday Mar - Thursday Apr - Saturday May - Tuesday Jun - Thursday Jul - Sunday Aug - Wednesday Sep - Friday Oct - Monday Nov - Wednesday Dec - Saturday
现在需要反转输出逻辑,实现按星期几归类对应的月份,期望输出如下:
Sunday - Jul Monday - Jan Feb Oct Tuesday - May Wednesday - Aug Nov Thursday - Mar Jun Friday - Sep Saturday - Apr Dec
计划使用嵌套循环(如for d in {1..7};)并结合数组来实现,请问具体该如何编写脚本?
实现脚本
可以通过数组存储对应星期的月份列表,先遍历每个月份计算月末星期,再将月份添加到对应星期的数组元素中,最后按固定的星期顺序输出结果。具体脚本如下:
#!/bin/bash # 处理年份参数,默认当前年 y=${1:-$(date +%Y)} # 定义星期顺序数组,确保输出顺序符合期望 weekdays=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday") # 初始化对应星期的月份数组,每个元素初始为空 declare -a month_lists=("" "" "" "" "" "" "") # 遍历12个月份,计算每个月的月末星期,并归类 for m in {1..12}; do # 获取月份缩写(如Jan) month_abbr=$(date -d "$m/1/$y" +%b) # 计算月末日期的星期 if [ $m -eq 12 ]; then last_day_week=$(date -d "1/1/$((y+1)) - 1 days" +%A) else last_day_week=$(date -d "$((m+1))/1/$y - 1 days" +%A) fi # 找到该星期在weekdays数组中的索引,将月份添加到对应列表 for idx in "${!weekdays[@]}"; do if [ "${weekdays[$idx]}" = "$last_day_week" ]; then month_lists[$idx]="${month_lists[$idx]} $month_abbr" break fi done done # 按星期顺序输出结果,去除开头的空格 for idx in "${!weekdays[@]}"; do echo "${weekdays[$idx]} - ${month_lists[$idx]:1}" done
关键逻辑说明
- 参数处理:用
${1:-$(date +%Y)}简化原脚本的年份判断,当没有传入参数时自动使用当前年份。 - 星期顺序控制:定义
weekdays数组固定输出顺序,避免因系统本地化设置导致星期顺序变化。 - 归类存储:用
month_lists数组对应每个星期的月份集合,遍历月份时找到对应星期的索引,将月份缩写追加到数组元素中。 - 输出格式化:输出时用
${month_lists[$idx]:1}去掉每个月份列表开头的空格,保证格式整洁。
内容的提问来源于stack exchange,提问作者Leeberichie
相关产品推荐
相关产品推荐

