Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

bashで祝日を含めた休日の判定

$
0
0

目的 : bashを用いて祝日を含めた休日の判定をする

シェルなどを平日のみ動作させたい、祝日を含めて休日のみ動作させたい場合、
土曜日・日曜日だけでなく、祝日も考慮する必要があります。
本記事は、そのケースの実現方法の説明です。

環境

  • Linux
  • bash

祝日の一覧を入手する

祝日の一覧は、内閣府が公開しています。

https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

祝日の一覧を記述した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は、
1. Personal Access Tokensにアクセス
2. Generate new tokenをクリック
3. Noteに任意の文字列を入力
4. public_repoにチェック
5. Generate tokenをクリック
で作成できます。

祝日を随時更新せずに休日判定する場合

holiday-jp様のリポジトリから祝日の一覧のファイル(holidays.yml)をダウンロードし、使用します。
こちらは、休日判定する環境がインターネット接続不可でも構いません。

注意点
祝日に変更があった場合、再度祝日の一覧ファイルをダウンロードする必要があります。

休日を判定する

ここでは、シェルを実行する際に日付の引数を取り、休日の判定結果(と祝日の場合は祝日名)を返す形としました。

example.sh
#!/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
result
$ ./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: 重要な記念日

original.sh
#祝日の一覧を記述しているファイル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)" ] ; thenif[-n"$(/bin/grep $target_date$PUBLIC_HOLIDAY_LIST)"]||[-n"$(/bin/grep $target_date$ORIGINAL_HOLIDAY_LIST)"];then# ...fi

Viewing all articles
Browse latest Browse all 2722

Trending Articles