データを形式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
) というものです。デモンストレーションのために、最初の行は翌月の最初の土曜日を示し、2 行目は1 週間前( -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 は 1 月、2 は 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