もちろんです。FromとToの間の日時をyyyymmdd形式で受け取り、それをyyyymmdd_hh形式に変換して出力するシェルスクリプトを作成しましょう。スクリプトは以下のようになります。
- スクリプトファイルの作成 ファイル名として
date_range.shを使用します。
touch date_range.sh
nano date_range.sh
- スクリプト内容の編集 次に、以下の内容を
date_range.shに追加します:
#!/bin/bash
# 入力引数の確認
if [ "$#" -ne 2 ];then
echo "Usage: $0 FROM_DATE TO_DATE"
echo "Dates should be in yyyymmdd format"
exit 1
fi
# 引数を変数に格納
FROM_DATE=$1
TO_DATE=$2
# 日付の形式チェック (正規表現を使用)
if [[ ! $FROM_DATE =~ ^[0-9]{8}$ ]] || [[ ! $TO_DATE =~ ^[0-9]{8}$ ]]; then
echo "Error: Dates must be in yyyymmdd format"
exit 1
fi
# FROM_DATEおよびTO_DATEを秒単位に変換
FROM_DATE_SEC=$(date -d "${FROM_DATE}" +%s)
TO_DATE_SEC=$(date -d "${TO_DATE}" +%s)
# エラー処理
if [ $? -ne 0 ]; then
echo "Error: invalid date format"
exit 1
fi
# 日付の変換ループ
CURRENT_SEC=$FROM_DATE_SEC
while [ "$CURRENT_SEC" -le "$TO_DATE_SEC" ]; do
for HOUR in {00..23}; do
DATE_HOUR=$(date -d "@$CURRENT_SEC" +%Y%m%d)_$HOUR
echo "$DATE_HOUR"
done
CURRENT_SEC=$(($CURRENT_SEC + 86400)) # 次の日 (86400秒 = 1日)
done
exit 0
- スクリプトに実行権限を付与 スクリプトに実行権限を与えます。
chmod +x date_range.sh
- スクリプトを実行 以下のように引数を指定してスクリプトを実行します:
./date_range.sh 20220101 20220102
スクリプトの説明
- 引数のチェック
if [ "$#" -ne 2 ];then
echo "Usage: $0 FROM_DATE TO_DATE"
echo "Dates should be in yyyymmdd format"
exit 1
fi
コマンドライン引数が2つでない場合、エラーメッセージを表示してスクリプトを終了します。
- 日付の形式チェック
if [[ ! $FROM_DATE =~ ^[0-9]{8}$ ]] || [[ ! $TO_DATE =~ ^[0-9]{8}$ ]]; then
echo "Error: Dates must be in yyyymmdd format"
exit 1
fi
正規表現を使用して、引数が yyyymmdd 形式であるかを確認します。
- 日付の秒単位への変換
FROM_DATE_SEC=$(date -d "${FROM_DATE}" +%s)
TO_DATE_SEC=$(date -d "${TO_DATE}" +%s)
dateコマンドを使って、指定された日付を秒単位に変換します。
- 日付と時間の出力ループ
CURRENT_SEC=$FROM_DATE_SEC
while [ "$CURRENT_SEC" -le "$TO_DATE_SEC" ]; do
for HOUR in {00..23}; do
DATE_HOUR=$(date -d "@$CURRENT_SEC" +%Y%m%d)_$HOUR
echo "$DATE_HOUR"
done
CURRENT_SEC=$(($CURRENT_SEC + 86400)) # 次の日 (86400秒 = 1日)
done
ここでは、whileループを使って日付を1日ずつ進めます。さらに、内側のforループで0時から23時までの各時間に対してyyyymmdd_hh形式に変換して出力します。
このスクリプトを使えば、指定した範囲内の全ての日付を yyyymmdd_hh 形式で出力することができます。

コメント