特定の日付範囲内のすべての日付を変数に保存

特定の日付範囲内のすべての日付を変数に保存

2つのユーザー入力日の間に可能なすべての日付を保存したいと思います。入力は次のとおりです20140605そして20140830

ループを使用して、指定された日付間の各日付を変数に保存して使用できるようにしたいと思います。

生成または計算された日付は入力と同じ形式でなければなりません。

startdate=20141030
starttime=165800

enddate=20141120
endtime=175050

day=`expr $startdate % 100`
month=`expr $startdate % 10000`
year=`expr $startdate % 100000000`
month=`expr $month / 100`
year=`expr $year / 10000`
echo "$year  $month  $day"

while [ $enddate -ge $cdate ]
do
var=$cdate

#using variable var

if  [ $day -eq 31 ]; then
cdate=`expr $cdate - $day`
day=1
((month++))
cdate=`expr $cdate + 100 + $day`
#cdate=`expr $cdate + $day`
    if  [ $month -eq 13 ]; then
        #tmp=`expr $month \* 100`
        cdate=`expr $cdate - $month \* 100`
        month=1
        ((year++))
        cdate=`expr $cdate + 10100`
        if [ $year -eq 2999 ]; then
            ((year++))
            echo $cdate
            cdate=30010100
        fi
    fi
else
    ((day++))
    ((cdate++)) 
fi

if [ $enddate == $cdate ]; then
check=1
fi
done

私はこのように要件を実装しようとしています。ただし、コンパイル時には次のように言います。

単項演算子が必要です。

このエラーの原因は何ですか?シェルスクリプトを使用してこの問題をどのように解決するのですか?

ベストアンサー1

私はこの問題に全く異なるアプローチをとります。すべての日付計算を手動で実行すると、エラーが発生しやすくなります(月が常に31日でない場合、うるう年などがあります)。さらに、コードを見ると、自分が何をしているのかを知ることは困難です(これは非常に悪いことです)。

#!/bin/bash
startdate=20141030
enddate=20141120

dates=()
for (( date="$startdate"; date != enddate; )); do
    dates+=( "$date" )
    date="$(date --date="$date + 1 days" +'%Y%m%d')"
done
echo "${dates[@]}"

これはdateコマンドを使用してすべての計算を処理し、各日付を$dates配列に保存します。

結果は次のとおりです。

20141030 20141031 20141101 20141102 20141103 20141104 20141105 20141106 20141107 20141108 20141109 20141110 20141111 20141112 20141113 20141114 20141115 20141116 20141117 20141118 20141119

おすすめ記事