年間54日目の日曜日の日付を印刷したいと思います。次のスクリプトを作成しましたが、出力にエラーが発生します。
スクリプト:
req_date=`date +%m%d%Y`
for i in {1..54}
do
NEXT_DATE=$(date +%m%d%Y -d "$req_date + 7*$i day")
echo "$NEXT_DATE"
done
出力
+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 + 7*32 day'
date: invalid date ‘11132019 + 7*32 day’
+ NEXT_DATE=
+ echo ''
+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 + 7*33 day'
date: invalid date ‘11132019 + 7*33 day’
+ NEXT_DATE=
+ echo ''
+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 + 7*34 day'
date: invalid date ‘11132019 + 7*34 day’
+ NEXT_DATE=
+ echo ''
+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 + 7*35 day'
date: invalid date ‘11132019 + 7*35 day’
+ NEXT_DATE=
..
誰かが私を助けることができますか?
答え1
存在するksh93
、
printf '%(%Y-%m-%d)T\n' '2020-01 '{1..52}'th Sunday'
2020年の全52日曜日のリストを提供します(より便利で明確な形式で提供されますが、YYYY-MM-DD
本当に(本当に?)必要に応じていつでも変更できます)。%m%d%Y
printf '%(%Y-%m-%d)T\n' '2023-01 '{1..53}'th Sunday'
2023年には53。
年に日曜日は54日にすることはできません。
年に54人がいる可能性があります週そのうちの2つは完了していないため、date +%W
00〜53の値を使用できますが、00週または53週のうち少なくとも1つの日曜日は隣接する年に属します(そして00週または53週が1年以上に属することがあります)。 ; ISOの週番号()を使用すると、%V
これを防ぎ、01から53まで進みます。
答え2
私の答えは開始日から30週間のすべての木曜日で、最初の木曜日を選択する順序を使用します。
paul@debian:~$
strt="2023/06/01"
for i in `seq 0 30`;
do
echo "datum $i $(date -d "${strt}+${i} week " +"%A/%d/%m/%Y" )"
done
datum 0 Thursday/01/06/2023
datum 1 Thursday/08/06/2023
datum 2 Thursday/15/06/2023
datum 3 Thursday/22/06/2023
datum 4 Thursday/29/06/2023
datum 5 Thursday/06/07/2023
datum 6 Thursday/13/07/2023
datum 7 Thursday/20/07/2023
datum 8 Thursday/27/07/2023
datum 9 Thursday/03/08/2023
datum 10 Thursday/10/08/2023
datum 11 Thursday/17/08/2023
datum 12 Thursday/24/08/2023
datum 13 Thursday/31/08/2023
datum 14 Thursday/07/09/2023
datum 15 Thursday/14/09/2023
datum 16 Thursday/21/09/2023
datum 17 Thursday/28/09/2023
datum 18 Thursday/05/10/2023
datum 19 Thursday/12/10/2023
datum 20 Thursday/19/10/2023
datum 21 Thursday/26/10/2023
datum 22 Thursday/02/11/2023
datum 23 Thursday/09/11/2023
datum 24 Thursday/16/11/2023
datum 25 Thursday/23/11/2023
datum 26 Thursday/30/11/2023
datum 27 Thursday/07/12/2023
datum 28 Thursday/14/12/2023
datum 29 Thursday/21/12/2023
datum 30 Thursday/28/12/2023
答え3
変更されたスクリプトは次のとおりです。
- セットリクエスト日正しいのはdd/mm/yyyで、次の日曜日です。
- 日付オフセット計算にbash構文を使用する
- ループはインデックス1ではなく0から始まるので、54ではなく53で終わります。
req_date=`date +%m/%d/%Y -d sunday`
for i in {0..53}
do
NEXT_DATE=$(date +%m%d%Y -d "$req_date + $((7*i)) days")
echo "$NEXT_DATE"
done
答え4
0週間または54週間の問題を回避するには、基準に基づいてすべての日付を繰り返し、すべての日曜日を選択できます。
#!/bin/bash
#get day of year number for last day of year
total_days=$(date -d'2019-12-31' +%j)
#loop over all days and select Sundays
for (( i=0 ; i<${total_days} ; i++ )) ; do
date -d"2019-01-01 + ${i}" +"%a %Y-%m-%d" | grep Su | cut -d' ' -f2
done
req_date
また、年中すべての日曜日の開始日を指定するには、このオプションを使用する必要があります-d
。 (次の54日曜日から始めたくない場合req_date
)
あなたの質問に記載されている問題に関して:
コメントですでに述べたように、入力形式が正しくありません。可能な日付入力文字列はやや複雑で解釈するのは直感的ではないので、やや拡張されますが、詳細についてはで説明しますinfo "date input formats"
。これは長い説明です。ハイフンやスラッシュを使用しないので、ここでは
29.8 日付文字列の純粋な数値
10進数がYYYYMMDD形式で、日付文字列の前に別のカレンダー日付項目(*カレンダー日付項目注::)が表示されない場合、YYYYは年として読み取られ、MMは月として読み取られます。 DD は、日付が指定したカレンダー日付の月として読み込まれます。
したがって、あなたの日付11132019
は存在しない1113-20-19なので失敗します。
個人的には、私は上記のスクリプトに示されているように、米国の日付形式と他の日付形式との間の混乱を排除するためにyyyy-mm-ddを使用することを好みます。