bash - 列出在一周的同一天结束的月份

标签 bash unix

这是一项任务。我有以下代码:

#! /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};

并将月份存储在数组中?

最佳答案

#! /usr/bin/env bash

# if year is not specified use the current year
declare -r year="${1:-$(date +%Y)}"

# associative array (aka hash table)
declare -A months_per_day=()
for m in {01..12}; do
    day_month=$(LANG=C date -d "${year}-${m}-01 +1 month -1 day" +"%A %b")
    months_per_day[${day_month% *}]+=" ${day_month#* }"
done

for day in Sunday Monday Tuesday Wednesday Thursday Friday Saturday; do
    echo "${day} -${months_per_day[${day}]:-}"
done

输出:

Sunday - Jul
Monday - Jan Feb Oct
Tuesday - May
Wednesday - Aug Nov
Thursday - Mar Jun
Friday - Sep
Saturday - Apr Dec

关于bash - 列出在一周的同一天结束的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74764459/

相关文章:

linux - 使用 SED 通过带有要删除的行号的索引来删除某些行

linux - Bash:从 chroot 和切换用户中执行命令

linux - UNIX,如何从多个文件中删除注释?

linux - 在shell脚本中将文件从两台机器移动到四台机器

linux - 比较两个服务器之间的文件校验和并报告不匹配

bash - 试图将一个字符串拆分为两个变量

C HTTP 服务器 - 多线程模型?

c++ - 是否导出共享库中类的构造函数?

linux - 扫描多个文件扩展名并在找到时复制到新目录

linux - 我对运行 shell 脚本的 "sh xxx.sh"和 "./xxx.sh"之间的差异感到困惑