目的 : bashを用いて祝日を含めた休日の判定をする
シェルなどを平日のみ動作させたい、祝日を含めて休日のみ動作させたい場合、
土曜日・日曜日だけでなく、祝日も考慮する必要があります。
本記事は、そのケースの実現方法の説明です。
環境
- Linux
- bash
祝日の一覧を入手する
祝日の一覧は、内閣府が公開しています。
祝日の一覧を記述したcsvファイルが公開されていますが、
2020年2月29日現在、2021年までしか記述されていません。
そのため、下記を使用します。
holiday-jp様のリポジトリ
https://github.com/holiday-jp/holiday_jp/blob/master/holidays.yml
... 2019-11-03: 文化の日 2019-11-04: 文化の日 振替休日 2019-11-23: 勤労感謝の日 2020-01-01: 元日 2020-01-13: 成人の日 2020-02-11: 建国記念の日 2020-02-23: 天皇誕生日 2020-02-24: 天皇誕生日 振替休日 ...
ここでは、上記のyml形式のファイルを使用しましたが、他プログラミング言語用のモジュールもあるので、
他環境で使用したい場合は、上記のリポジトリを探してみてください。
祝日を随時更新して休日判定する場合
祝日は変更になることがある(最近だと天皇誕生日の祝日の変更など)ので、
下記のcurlコマンドをcrontabなどで定期的に実行することで、自動的にダウンロードします。
# "トークン"の箇所に、OAuthTokenを入力
curl -H 'Authorization: token トークン' -H 'Accept: application/vnd.github.v3.raw' -L https://api.github.com/repos/holiday-jp/holiday_jp/contents/holidays.yml > holidays.yml
なお、下記が満たされていることが前提です。
- 休日判定する環境がインターネット接続可能であること
- GitHubのリポジトリが最新の祝日一覧に更新されていること
- GitHubのアカウントを作成済みで、OAuthTokenを発行していること
OAuthTokenは、
- Personal Access Tokens にアクセス
-
Generate new token
をクリック -
Note
に任意の文字列を入力 -
public_repo
にチェック -
Generate token
をクリック
で作成できます。
祝日を随時更新せずに休日判定する場合
holiday-jp様のリポジトリから祝日の一覧のファイル(holidays.yml)をダウンロードし、使用します。
こちらは、休日判定する環境がインターネット接続不可でも構いません。
注意点
祝日に変更があった場合、再度祝日の一覧ファイルをダウンロードする必要があります。
休日を判定する
ここでは、シェルを実行する際に日付の引数を取り、休日の判定結果(と祝日の場合は祝日名)を返す形としました。
#!/bin/bash
#祝日の一覧を記述しているファイル
PUBLIC_HOLIDAY_LIST='./holidays.yml'
#休日、祝日を判定する対象の日付
target_date=$(/bin/date +"%Y-%m-%d" -d $1)
#祝日の場合
if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] ; then
#祝日名を取得
public_holiday_name=$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST | /bin/awk -F ':' '{print $2}')
echo "$target_date は祝日:$public_holiday_name です."
#休日(土曜日,日曜日)の場合
elif [ -n "$(/bin/date -d $target_date | /bin/grep -E "[土日]曜日")" ] ; then
#曜日を取得
day_of_the_week=$(/bin/date -d $target_date | /bin/awk '{print $4}')
echo "$target_date は$day_of_the_weekです."
#平日の場合
else
echo "$target_date は平日です."
fi
$ ./holiday.sh 2020-01-13
2020-01-13 は祝日: 成人の日 です.
$ ./holiday.sh 20200113
2020-01-13 は祝日: 成人の日 です.
$ ./holiday.sh 20200114
2020-01-14 は平日です.
$ ./holiday.sh 20200112
2020-01-12 は日曜日です.
$ ./holiday.sh 20200211
2020-02-11 は祝日: 建国記念の日 です.
おまけ : 独自の祝日を判定したい場合
一般的な祝日の一覧ファイルとは別に、以下の形式で記述し、if文を変更すればOK
2020-01-14: 大事な記念日
2020-02-05: 重要な記念日
#祝日の一覧を記述しているファイル
PUBLIC_HOLIDAY_LIST='./public_holidays.yml'
#独自の祝日を記述しているファイル
ORIGINAL_HOLIDAY_LIST='./original_holidays.yml'
#休日、祝日を判定する対象の日付
target_date=$(/bin/date +"%Y-%m-%d" -d $1)
#祝日の場合
#if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] ; then
if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] || [ -n "$(/bin/grep $target_date $ORIGINAL_HOLIDAY_LIST)" ] ; then
# ...
fi