シェルスクリプトで祝日判定とメッセージ通知を自動化する自宅検証

## はじめに

今回は、前回の記事に続いて[日本の祝日を自動取得して活用するシェルスクリプト検証](https://qiita.com/free-honda/items/efaa963bcd7a79e09c8b)の続きになります。

前回は「holiday.sh」を使って内閣府の祝日CSVを取得し、現在の年の祝日情報を抽出・保存するシェルスクリプトを作成しました。

この記事では、追加機能として「check_day.sh」を作成し、今日が祝日かどうかを判定し、メッセージを表示する処理を実装します。

## 前提条件
今回の検証を進めるにあたり、以下の環境が必要です。

:::note info
**検証環境**
**Linuxディストリビューション:**
仮想環境や実サーバー上で稼働しているLinux（ここではAlmaLinux 9.3を使用）

**祝日取得スクリプト実装済み:** 
[こちらの記事](https://qiita.com/free-honda/items/efaa963bcd7a79e09c8b)で説明している祝日取得スクリプトが完了していること
:::

**自宅のVirtualBox環境**
今回も VirtualBox 上で構築した検証環境を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/70df8950-ddfa-2728-1d71-60373a8276e9.png)


:::note info
※検証には、実行中の「AlmaLinux」を使用しています。
:::

## 知識整理
今回の構築に必要な知識を整理します。

**シェルスクリプト**
LinuxやUnixシステム上で複数のコマンドを自動的に実行するためのプログラムです。

繰り返し行う作業や、特定の条件に応じた処理を自動化するのに役立ち、特にシステム管理や業務の効率化に使われます。

:::note warn
過去の記事でもシェルスクリプトを使った検証をしているので、興味のある方は読んでみてください。
[Linuxでの定期再起動をシェルスクリプトとcronジョブで自動化する方法と検証結果](https://qiita.com/free-honda/items/efa3c889888fd7ef75b5)

さらに詳しく知りたい場合は、以下のリンクも参考にしてください。
**シェルスクリプトについて**
参考サイト：https://sc.megabank.tohoku.ac.jp/ph3-doc/howto/linux/script.html
:::

簡単なテキストファイル形式で作成でき、bashやshなどのシェル環境で実行されます。

### ディレクトリ構成
今回のディレクトリ構成は以下の通りです。

```
.
├── holiday.sh      # 祝日取得用のシェルスクリプト
├── check_day.sh    # 祝日判定用のシェルスクリプト
├── holiday.txt     # 取得した祝日情報が保存されるファイル
└── holiday.log     # 実行結果やログ情報が記録されるファイル
```

### フロー処理の流れ
「holiday.sh」の処理の流れは、[前回の記事](https://qiita.com/free-honda/items/efaa963bcd7a79e09c8b)で紹介しています。今回は、新しく作成する「check_day.sh」について説明します。

このスクリプトの基本的な動作は、「今日が祝日かどうか」を判定し、その結果に応じたメッセージを出力することです。

```check_day.sh
+-----------------------------+
|    スクリプト開始            |
+-----------------------------+
               |
               v
+-----------------------------+
| 今日の日付を取得             |
| (`today=$(date +%Y-%-m-%-d)`)|
+-----------------------------+
               |
               v
+-----------------------------+
| holiday.txtに日付が存在するか |
| (grep "$today" holiday.txt)  |
+-----------------------------+
     |          |
     | YES      | NO
     |          |
     v          v
+-----------------------------+    +-------------------------------+
| "今日は祝日です！" と表示      |    | 曜日を取得 (day_of_week)        |
+-----------------------------+    +-------------------------------+
                                       |
                                       v
                      +-------------------------------------+
                      | 曜日が土日か平日かを判定           |
                      | (if [ $day_of_week -ge 6 ]; then)   |
                      +-------------------------------------+
                        |               |
                        | YES           | NO
                        v               v
         +----------------------+   +-------------------------+
         | "今日は土日です！"    |   | "今日は平日です！"         |
         | "ゆっくり休んでね～"   |   | "仕事がんばれ～" と表示    |
         +----------------------+   +-------------------------+

                        |
                        v
              +----------------------+
              |    スクリプト終了     |
              +----------------------+

```

## 検証の流れ

ここでは、検証用のLinuxサーバーを使ってシェルスクリプトを作成し、実行する手順を2つのステップで解説します。

:::note info
シェルスクリプトの作成と実行は以下の手順で行います。
**ステップ1：スクリプトの作成**
**ステップ2：スクリプトの実行確認**
:::

**※事前に検証環境が構築されていることを前提とします。**

## ステップ1：スクリプトの作成
まずは「check_day.sh」を以下の内容で作成します。

```check_day.sh
#!/bin/bash

# 今日の日付を取得
today=$(date +%Y-%-m-%-d)

# 祝日かどうかを確認
if grep -q "$today" holiday.txt; then
    echo "今日は祝日です！"
else
    # 平日か土日かを判定
    day_of_week=$(date +%u)
    
    if [ $day_of_week -ge 6 ]; then
        echo "今日は土日です！ゆっくり休んでね～"
    else
        echo "今日は平日です！仕事がんばれ～"
    fi
fi
```

このスクリプトは、まず現在の日付を取得し、それを holiday.txt と照合します。

祝日であれば「**今日は祝日です！**」と表示し、そうでなければ曜日に応じて「**今日は平日です！仕事がんばれ～**」「**今日は土日です！ゆっくり休んでね～**」と表示します。


## ステップ2：スクリプトの実行確認

作成したスクリプトに実行権限を付与し、動作を確認します。

```
chmod +x check_day.sh
./check_day.sh
```

検証している日は、2024年9月23日（月）、秋分の日の振替休日です。

```
[root@HONDA-TEST holiday]# date
Mon Sep 23 09:23:28 AM JST 2024
[root@HONDA-TEST holiday]# ./check_day.sh
今日は祝日です！
```


:::note warn
実行結果に応じて、以下のメッセージが表示されます。
**・祝日であれば「今日は祝日です！」
・平日であれば「今日は平日です！仕事がんばれ～」
・土日であれば「今日は土日です！ゆっくり休んでね～」**
:::

以下のように設定すれば、毎日、自動的に曜日(祝日)判定タスクを組むことができます。

```
crontab -e

**入力内容**
・・・・・
0 0 * * * /home/honda/holiday/check_day.sh
```

この設定により、毎日午前0時にcheck_day.shが実行されますので、自動化まで完璧ですね！

## まとめ

今回の検証では、祝日取得スクリプトに「check_day.sh」という判定用スクリプトを追加し、今日が祝日かどうかを判定する機能を実装しました。

このスクリプトによって、祝日、平日、土日に応じたメッセージが画面に表示されるようになり、日常業務で簡単な通知システムとして活用できます。

## おまけ
平日と土日のバージョンも検証してみました。以下のように、「today」変数に任意の平日や土日の日付を設定して動作を確認します。

```check_day.sh
# 今日の日付を取得
today=$(date +%Y-%-m-%-d)
```

**平日の場合**
```check_day.sh
# 今日の日付を 2024年9月24日に固定
today="2024-9-24"
```

```csharp
[root@HONDA-TEST holiday]# ./check_day.sh
今日は平日です！仕事がんばれ～
```


**土日の場合**
```check_day.sh
# 今日の日付を 2024年9月21日に固定
today="2024-9-21"
```

```csharp
[root@HONDA-TEST holiday]# ./check_day.sh
今日は土日です！ゆっくり休んでね～
```

## 参考記事
https://qiita.com/free-honda/items/efaa963bcd7a79e09c8b

https://qiita.com/curry_rohio/items/31263850f847ad475931