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

如何反转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. 参数处理:用${1:-$(date +%Y)}简化原脚本的年份判断,当没有传入参数时自动使用当前年份。
  2. 星期顺序控制:定义weekdays数组固定输出顺序,避免因系统本地化设置导致星期顺序变化。
  3. 归类存储:用month_lists数组对应每个星期的月份集合,遍历月份时找到对应星期的索引,将月份缩写追加到数组元素中。
  4. 输出格式化:输出时用${month_lists[$idx]:1}去掉每个月份列表开头的空格,保证格式整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:15:42