sheru3

もちろんです。FromとToの間の日時をyyyymmdd形式で受け取り、それをyyyymmdd_hh形式に変換して出力するシェルスクリプトを作成しましょう。スクリプトは以下のようになります。

  1. スクリプトファイルの作成 ファイル名として date_range.sh を使用します。
   touch date_range.sh
   nano date_range.sh
  1. スクリプト内容の編集 次に、以下の内容を 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
  1. スクリプトに実行権限を付与 スクリプトに実行権限を与えます。
   chmod +x date_range.sh
  1. スクリプトを実行 以下のように引数を指定してスクリプトを実行します:
   ./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 形式で出力することができます。

コメント

タイトルとURLをコピーしました