这是一个任务。我有以下代码:
#! /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};
在数组中存储月份?
8条答案
按热度按时间nhjlsmyf1#
输出量:
o2rvlv0m2#
使用GNU awk for time函数,使用大量中间变量和描述性命名的变量,使其易于理解:
上面的代码比在shell循环中多次调用
date
要快得多,而且修改它来做任何其他需要的事情都很简单。tyg4sfes3#
这个答案将你的实现重构为一个可重用的
getlastday
函数。然后,我们将getlastday与匹配的months进行7次循环匹配,并将其输出:[EDIT:版本2]
正如下面@markp-fuso的评论所说,上面的方法效率低下,因为需要84次迭代来构建列表。
下面是一个改进,我们构造了一个
res
结果数组,其中有7个条目。一个条目代表一周中的每一天。然后我们使用+%u
来获取日期编号,而不是日期字符串。这将为我们提供res
结果附加的索引,在那里附加月份:xiozqbni4#
使用jq可以解决您的任务:
输出
ohtdti5x5#
尝试遵循此算法以获得预期结果:
我希望它能帮助你
mlnl4t2r6#
尝试以下Shellcheck-clean代码:
dzjeubhm7#
这将打印当前年份的列表:
j91ykkif8#
从技术上讲,您需要的唯一信息是一月的结束日期,以及(a)一年是否是闰年,或者(B)二月是否与一月在同一周的同一天结束。
其余的不用运行
date
12次就可以很容易地推导出来