您可以使用该命令轻松获取该月的最后一个星期六,该命令以格式date
输出数据。strftime()
但是date
' 的语法将取决于您的操作系统。
在 FreeBSD 或 OSX中,有一个-v
选项可以“调整”日期,让您有很多控制权:
[ghoti@pc ~]$ date -v+1m -v1d -v6w '+%a %d %b %Y'
Sat 03 Nov 2012
[ghoti@pc ~]$ date -v+1m -v1d -v6w -v-1w '+%a %d %b %Y'
Sat 27 Oct 2012
这里的想法是我们将向前移动 1 个月 ( +1m
),回到本月的第一天 ( 1d
),然后移动到一周的第 6 天,即星期六 ( 6w
)。出于演示目的,第一行显示下个月的第一个星期六,第二行显示一周前( -v-1w
) 的日期。
或者,如果您想在 bash 脚本中添加一些数学运算,您可以执行以下操作:
#!/usr/local/bin/bash
# Get day-of-the-week for the first-of-the-month:
firstofmonth=$(date -j -v+1m -v1d '+%u')
# ^
# + This is the relative month to current.
# Subtract this from 7 to find the date of the month
firstsaturday=$((7 - $firstofmonth))
# 7 days before that will be the last Saturday of the previous month
lastsaturday=$(date -j -v+1m -v${firstsaturday}d -v-7d '+%Y-%m-%d')
使用该-v
选项,1 是一月,2 是二月,等等。或者它可以是相对的,正如我在这里展示的那样,下个月 +1,上个月 -1,等等。
在 Linux中, date 使用-d
解释日期文本描述的选项。所以:
#!/bin/bash
firstofmonth=$(date -d '+1 months' '+%Y%m01')
firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$(( 7 - $(date -d "$firstofmonth" '+%u') ))
lastsaturday=$(date -d "$firstsaturday -7 days" '+%d')
请注意,如果您使用的是 cron,则可以简化此操作。您知道最后一个星期六将在该月的最后 7 天之内,因此我们可以首先使用 cron 将事情限制在星期六,然后在脚本中检查该月的最后一个。这将在每个星期六运行该脚本,但它不会执行任何操作,除非它应该执行。例如,cron 选项卡是
# ↙ "0 0"=midnight
0 0 * * 0 /path/to/script.sh
# ↖ 0=Sunday
并script.sh
开始:
#!/bin/bash
if [[ $(date '+%d' -lt $(date -d "$(date -d '+1 month' '+%Y%m01') -7 days" '+%d') ]]; then
exit
fi
您也可以将此测试放在 crontab 中,尽管它看起来有点难看,因为您需要转义百分号:
0 0 * * 0 \
test $(date '+\%d') -ge $(date -d "$(date -d '+1 month' '+\%Y\%m01') -7 days" '+\%d') \
&& /path/to/command