その月の前の週の番号が必要です。
3月の第2週では、前の週は1になります。4月の第1週では、前の週は5になります。
私の週は月曜日から始まります。
WEEK=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))
前の週を取得するために、これから1を引くにはどうすればよいですか(週が1の場合、例外があるので、気にする必要はありません)。
たった4週間の2月が自動的に認識されるのもいいですね。
私が間違っていなければ、あなたの表現(ここで少し再編成されています)は、現在の月の最初の日に対応する週番号、今日に対応する週番号を見つけ、その差を月の週として計算しますか?
first=$(date -d "-$(($(date +%d)-1)) days")
weekofmon=$(( 1 + $(date +%V) - $(date -d "$first" +%V) ))
そうで、先週の月が必要な場合は、「今日」を「7日前」(すべての場所)に置き換えて、対応する月を取得するだけで十分ではありません。その日?
now="7 days ago"
first=$(date -d "$now - $(($(date +%d -d "$now" )-1)) days")
weekofmon=$(( 1 + 10#$(date +%V -d "$now") - 10#$(date -d "$first" +%V) ))
date
が「7日前-3日前」のような式を解析できることに依存しています。 date +%V
は、先頭にゼロが付いた10未満の週番号を出力します。これにより、それらは8進数として解釈され、08
と09
が壊れます。 10#
を追加して、bashに10進数の数値を強制的に取得させます。
同じ月の最初の日を取得するための少し短い方法:
first=$(date -d "$now" +"%Y-%m-01")
(形式は異なりますが、date
はそれを解釈できるはずです。)