以下のシェルスクリプトでは、指定された日付範囲を一度変数に格納してから、その変数を使って日付を出力します。
#!/bin/bash
# 引数チェック
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <From yyyymmdd> <To yyyymmdd>"
exit 1
fi
# 引数を変数に格納
FROM_DATE=$1
TO_DATE=$2
# 日付のフォーマットチェック
if ! date -d "${FROM_DATE}" +"%Y%m%d" >/dev/null 2>&1; then
echo "Invalid From date: ${FROM_DATE}"
exit 1
fi
if ! date -d "${TO_DATE}" +"%Y%m%d" >/devnull 2>&1; then
echo "Invalid To date: ${TO_DATE}"
exit 1
fi
# FROM_DATEを秒数に変換
FROM_DATE_SEC=$(date -d "${FROM_DATE}" +%s)
# TO_DATEを秒数に変換
TO_DATE_SEC=$(date -d "${TO_DATE}" +%s)
# 秒単位の日数を計算
DAY_SEC=86400
# 日付の範囲を格納する配列
dates=()
# 指定した日付の範囲を配列に格納
CURRENT_DATE_SEC=$FROM_DATE_SEC
while [ "$CURRENT_DATE_SEC" -le "$TO_DATE_SEC" ]; do
dates+=($(date -d "@${CURRENT_DATE_SEC}" +"%Y%m%d"))
CURRENT_DATE_SEC=$(($CURRENT_DATE_SEC + $DAY_SEC))
done
# 格納した日付を出力
for date in "${dates[@]}"; do
echo $date
done
このスクリプトの動作は以下の通りです:
- 引数の数をチェックし、2つの日付が提供されていることを確認します。
- 引数を適切な変数に格納します。
- 各引数が有効な日付形式であるかをチェックします。
dateコマンドを使用して日付を秒数に変換します。- 一日を秒数(86400秒)として定義します。
- ループを使用して、開始日から終了日までの日付を配列
datesに1日ごとに格納します。 - 配列
dates内の日付を順に出力します。
このスクリプトを実行するには、シェルスクリプトファイル(例:date_range.sh)として保存し、その後を実行可能にします:
chmod +x date_range.sh
実行方法は以下の通りです:
./date_range.sh 20230101 20230105
上記の例では、20230101 から 20230105 までの日付が順に出力されます。

コメント