第一●曜日に月次処理をさせたい、というのはよく見かけるのですが、crontab では表現できないですし、シェルスクリプトだけで書こうとするとかなり難儀します。そこで、perl のワンライナーで凌ぐことにしました。

第一日曜日の場合に何かをしたい場合は、こんな感じに書きます。


/usr/bin/perl -e '@_=localtime(time); exit(!($_[6]==0 && $_[3]<=7))' \
&& echo "do something"

第一日曜日の場合は、終了コード 0 が返るので、続行する処理が実行されるという仕組みです。$_[6]には曜日(0. 日曜, 1. 月曜, ... , 6.土曜)が入っていますので、お好きな曜日に変えて使いましょう。

ちょっとした応用ですが、日時処理と月次処理をまとめておきたい場合は、こんな感じに書くと良いでしょう。


#!/bin/bash

# 日時処理
# ...

# 月次処理日でない場合はここで抜ける
/usr/bin/perl -e '@_=localtime(time); exit(!($_[6]==0 && $_[3]<=7))' || exit 0;

# 月次処理
# ...

論理積と論理和は、とても便利ですね。