我想在bash中做一些日历操作 - 具体来说,我想弄清楚某个月的最后日期(包括闰年,为查找准备一个表对我来说不是一个有效的解决方案)。
据说我有以下代码:
$year=2009
$start_month=2
$end_month=10
for $month in $(seq $start_month $end_month); do
echo "Last date of "$(date +"%B" -d "${year}-${month}-01")" is: " ???
done
我无法弄清楚如何做这样的事情。我虽然date -d
会像POSIX mktime一样工作,并将无效日期折叠为有效的等价物,所以我可以说date -d "2009-03-00"
之类的内容并获得'2009-02-28',但没有这样的运气。
无论如何只使用标准GNU环境中bash上可用的内容吗?
答案 0 :(得分:6)
尝试:date -d 'yesterday 2009-03-01'
直觉我知道。早期版本的日期用于处理POSIX方式。
答案 1 :(得分:5)
date(1)的-d是GNU特定的;所以使用它只适用于GNU Linux。
更便携的解决方案(这应该适用于sh
AFAIK),是这样的:
: $(cal 4 2009); echo $_
答案 2 :(得分:3)
如果您不介意使用grep / awk / perl,可以查看cal
。
$ cal 4 2009
April 2009
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
编辑(MarkusQ):为了解决我的笑话解决方案,我将为您做出贡献:
cal 4 2009 | tr ' ' '\n' | grep -v ^$ | tail -n 1
答案 3 :(得分:1)
好吧,一种方法是在循环中观察当前日期,直到月份组件发生变化,从而为一轮保存日期组件。这会给你这个月的第一天和最后一天,但可能太慢了。
发表于2009年4月1日