今後6ヶ月間のすべての週末をどのようにリストしますか?

今後6ヶ月間のすべての週末をどのようにリストしますか?
$ SAT=$(date -dsaturday +%Y-%m-%d)
$ SUN=$(date -dsunday +%Y-%m-%d)
$ 
$ echo $SAT
2016-04-09
$ echo $SUN
2016-04-10
$ 

私は土曜日と日曜日の次の日付をリストする方法を知っています。

次の6ヶ月間、次の土曜日と日曜日の両方をリストする方法は?

Ubuntuでbashを使用しています。

答え1

土曜日および/または日曜日の最初の開始日を決定したら、相対日付を使用するbashスクリプトのループを使用してこれを実行できます。

#!/bin/bash

SAT=$(date -dsaturday +%Y-%m-%d)
SUN=$(date -dsunday +%Y-%m-%d)
# 365 days/year / 2 ~= 182 days
ENDSAT=$(date -d "$SAT + 182 days" +"%Y-%m-%d")
ENDSUN=$(date -d "$SUN + 182 days" +"%Y-%m-%d")

echo $SAT
echo $SUN

until [ "$SUN" == "$ENDSUN" ]; do
  SAT=$(date -d "$SAT + 7 days" +%Y-%m-%d)
  SUN=$(date -d "$SUN + 7 days" +%Y-%m-%d)
  echo $SAT
  echo $SUN
done

初期設定では「+6ヶ月」は使用しません。月ごとに日数が異なるため、作業日が多少異なる場合があります。

答え2

人が読める形式で週末を表示する最も簡単な方法は次のとおりです。

cal -A6

これは以下を印刷しますつなぎ:

                            2016
       April                  May                   June          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
                1  2   1  2  3  4  5  6  7            1  2  3  4  
 3  4  5  6  7  8  9   8  9 10 11 12 13 14   5  6  7  8  9 10 11  
10 11 12 13 14 15 16  15 16 17 18 19 20 21  12 13 14 15 16 17 18  
17 18 19 20 21 22 23  22 23 24 25 26 27 28  19 20 21 22 23 24 25  
24 25 26 27 28 29 30  29 30 31              26 27 28 29 30        


        July                 August              September        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
                1  2      1  2  3  4  5  6               1  2  3  
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   4  5  6  7  8  9 10  
10 11 12 13 14 15 16  14 15 16 17 18 19 20  11 12 13 14 15 16 17  
17 18 19 20 21 22 23  21 22 23 24 25 26 27  18 19 20 21 22 23 24  
24 25 26 27 28 29 30  28 29 30 31           25 26 27 28 29 30     
31                                                                

      October         
Su Mo Tu We Th Fr Sa  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30 31                 

リストが必要な場合ただ土曜日と日曜日:

nextsat="$(date -d "next sat" +%Y-%m-%d)"
for i in {0..26}; do
    date -d "$nextsat +$((i*7))   day" +%a-%Y-%m-%d
    date -d "$nextsat +$((i*7+1)) day" +%a-%Y-%m-%d
done

6ヶ月(半年)の範囲は(およそ)~182日も、特別な事情がない限り26週です。だから{0..26}。今週は26週間残り0週目です。厳密に26週間が必要な場合は{0..25}を使用してください。

答え3

#!/bin/bash
WEEK=0
END_MONTH=$((`date -d "6 months" +%m` + 1)) |sed 's/^0//'
while true; do
    CURRENT_MONTH=`date -d "$WEEK weeks" +%m`|sed 's/^0//'
    if [[ $CURRENT_MONTH -ne $END_MONTH  ]]; then
            date -d "$WEEK weeks saturday" +%Y-%m-%d
            date -d "$WEEK weeks sunday" +%Y-%m-%d
    else
            #$END_MONTH reached... exiting
            exit 0
    fi
    let "WEEK++"
done

関連情報