環境変数とファイル監視を組み合わせたシェルスクリプトの実装

## はじめに
本記事では、シェルスクリプトを使用して祝日ファイルを自動的に監視し、管理する方法について解説します。

祝日データは、多くのアプリケーションやシステムで重要な役割を果たしていますが、その更新や管理は手間がかかることが多いです。

そこで、環境変数を活用し、簡潔で効率的なスクリプトを作成することで、祝日ファイルの存在を確認し、自動で取得できる仕組みを構築します。具体的には、指定したパスにある祝日ファイルが存在しない場合はバックアップファイルを取得する処理を行います。

これにより、祝日データの管理がよりスムーズに行えるようになります。それでは、実際のスクリプトの実装を見ていきましょう。


## いろいろなシェルスクリプトの書き方例
```test.sh
#!/bin/bash

# メイン処理
while true; do
    # 現在の祝日ファイルを取得
    CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.csv 2> /dev/null)

    # 現在の祝日ファイルが存在しない場合、バックアップ祝日ファイルを取得
    if [[ -z "${CURRENT_HOLIDAY_FILE}" ]]; then
        CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/old_syukujitsu.csv 2> /dev/null)
    fi

    # ファイルが見つかった場合
    if [[ ! -z "${CURRENT_HOLIDAY_FILE}" ]]; then
        break  # ループを終了
    fi
done

echo "使用するファイル: $CURRENT_HOLIDAY_FILE"
```

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

# CSVファイルの取得先URL
URL="https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"

# 取得したCSVファイルの保存先パス（/rootディレクトリ）
SAVE_PATH="/Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.csv"

# 既存のCSVファイルのパス
EXISTING_CSV="/Users/hondaakiratarou/Desktop/syukujitsu//old_syukujitsu.csv"

# ログファイルのパス
LOG_FILE="/Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.log"

# CSVファイルを取得する関数
fetch_csv() {
    # curlを使用してURLからファイルをダウンロード
    curl -sSfL "$URL" -o "$SAVE_PATH"
}

# CSVファイルのバックアップを作成
cp "$SAVE_PATH" "$EXISTING_CSV"

# CSVファイルを取得して保存
fetch_csv

# 取得に失敗した場合は古いCSVファイルを使用
if [ $? -ne 0 ]; then
    echo "Failed to fetch CSV file from $URL." >> "$LOG_FILE"
    # 失敗した場合は「old_syukujitsu.csv」として保存
    mv "$SAVE_PATH" "$EXISTING_CSV"
else
    # 文字コードをLinux用に変換（UTF-8に変換）
    iconv -f SJIS -t UTF-8 "$SAVE_PATH" > "$SAVE_PATH.tmp" && mv "$SAVE_PATH.tmp" "$SAVE_PATH"
    # 既存のCSVファイルを削除
    rm -f "$EXISTING_CSV"
fi
```

```test.sh
# 環境変数セット
CURRENT_HOLIDAY_FILE=""

# メイン処理
while true; do
    # 現在の祝日ファイルを取得
    CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.csv 2> /dev/null)

    # 現在の祝日ファイルが存在しない場合、バックアップ祝日ファイルを取得
    if [[ -z "${CURRENT_HOLIDAY_FILE}" ]]; then
        CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/old_syukujitsu.csv 2> /dev/null)
    fi

    # ファイルが見つかった場合
    if [[ ! -z "${CURRENT_HOLIDAY_FILE}" ]]; then
        break  # ループを終了
    fi
done

echo "$CURRENT_HOLIDAY_FILE"
```

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

# ファイルのパス
SYUKUJITSU_FILE="/Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.csv"
OLD_SYUKUJITSU_FILE="/Users/hondaakiratarou/Desktop/syukujitsu/old_syukujitsu.csv"

# syukujitsu.csvが存在するか確認
if ls "$SYUKUJITSU_FILE" > /dev/null 2>&1; then
    syukujitsu="$SYUKUJITSU_FILE"
else
    syukujitsu="$OLD_SYUKUJITSU_FILE"
fi

# 確認のため、選択されたファイルを表示
echo "使用するファイル: $syukujitsu"
```


```syukujitsu.log
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
Failed to fetch CSV file from https://ww8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv.
```

```パターン①.sh
# 環境変数セット
SHELL_NAME=test
INTERVAL=1


# 関数読み込み
. $HOME/bin/init.sh

# メイン処理
while [ $FLG_1 -eq 0 ]
do
    ###
    # 監視曜日取得
    ###

    WEEK_DAY=`date +%a`

    ###
    # 監視開始時刻取得
    ###

    START_TIME=`date +%s`

    ################################
    # 祝日ファイルの監視処理追加 #
    ################################

    CURRENT_HOLIDAY_FILE=""

    # 祝日ファイルの取得
    while true; do
        # 現在の祝日ファイルを取得
        CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.csv 2> /dev/null)

        # 現在の祝日ファイルが存在しない場合、バックアップ祝日ファイルを取得
        if [[ -z "${CURRENT_HOLIDAY_FILE}" ]]; then
            CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/old_syukujitsu.csv 2> /dev/null)
        fi

        # ファイルが見つかった場合
        if [[ ! -z "${CURRENT_HOLIDAY_FILE}" ]]; then
            break  # ループを終了
        fi
    done

    echo "$CURRENT_HOLIDAY_FILE"

    # ここに必要な他の処理を続ける...

done
```

```パターン②.sh
# 環境変数セット
SHELL_NAME=test.sh
INTERVAL=1

# 祝日ファイルの監視処理
CURRENT_HOLIDAY_FILE=""

# 祝日ファイルの取得
while true; do
    # 現在の祝日ファイルを取得
    CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/syukujitsu.csv 2> /dev/null)

    # 現在の祝日ファイルが存在しない場合、バックアップ祝日ファイルを取得
    if [[ -z "${CURRENT_HOLIDAY_FILE}" ]]; then
        CURRENT_HOLIDAY_FILE=$(ls /Users/hondaakiratarou/Desktop/syukujitsu/old_syukujitsu.csv 2> /dev/null)
    fi

    # ファイルが見つかった場合
    if [[ ! -z "${CURRENT_HOLIDAY_FILE}" ]]; then
        break  # ループを終了
    fi
done

echo "$CURRENT_HOLIDAY_FILE"


# 関数読み込み
. $HOME/bin/init.sh

################################
# メイン処理                   #
################################

while [ $FLG_1 -eq 0 ]
do
    ###
    # 監視曜日取得
    ###

    WEEK_DAY=`date +%a`

    ###
    # 監視開始時刻取得
    ###

    START_TIME=`date +%s`

    # ここに必要な他の処理を続ける...

done
```

## まとめ

本記事では、祝日ファイルを監視するシェルスクリプトの実装方法について説明しました。

環境変数を利用することで、スクリプトが柔軟に設定できるようになり、祝日データの管理が効率化されました。

また、指定したファイルが存在しない場合にバックアップファイルを取得する機能を実装しました。この方法を活用することで、祝日データの更新を自動化し、手間を減らすことができます。

シェルスクリプトを活用して、日常業務の効率化を図りましょう。

## 参考記事

https://qiita.com/free-honda/items/efaa963bcd7a79e09c8b

https://qiita.com/free-honda/items/d87cb5fedce714a87e34