![1년 중 모든 일요일의 날짜를 찾는 스크립트](https://linux55.com/image/163886/1%EB%85%84%20%EC%A4%91%20%EB%AA%A8%EB%93%A0%20%EC%9D%BC%EC%9A%94%EC%9D%BC%EC%9D%98%20%EB%82%A0%EC%A7%9C%EB%A5%BC%20%EC%B0%BE%EB%8A%94%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8.png)
일년 중 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.
1년에 일요일은 54일일 수 없습니다.
1년에 54명이 있을 수 있다주그 중 2개는 완료되지 않았으므로 date +%W
00~53의 값을 사용할 수 있지만 00주 또는 53주 중 적어도 하나의 일요일은 인접한 연도에 속하게 됩니다(그리고 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 날짜 문자열의 순수 숫자
십진수가 YYYYMMDD 형식이고 날짜 문자열에서 그 앞에 다른 달력 날짜 항목(*달력 날짜 항목 참고::)이 나타나지 않으면 YYYY는 연도로 읽혀지고 MM은 월로 읽혀집니다. DD는 날짜가 지정한 달력 날짜의 월로 읽혀집니다.
따라서 귀하의 날짜 11132019
는 존재하지 않는 1113-20-19이므로 실패합니다.
개인적으로 저는 위 스크립트에서 볼 수 있듯이 미국 날짜 형식과 다른 날짜 형식 간의 혼동을 배제하기 위해 yyyy-mm-dd를 사용하는 것을 선호합니다.