매월 마지막 일요일을 아는 방법

매월 마지막 일요일을 아는 방법

ESXI에서 스크립트를 작성하려고 하는데 "매월 마지막 일요일인 경우"를 추가해야 합니다. 나는 노력한다

date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d

작동하지 않지만 데비안에서는 작동합니다.

ESXI에서는 이제 August가 출력됩니다.

답변1

나는 문제가 있다고 믿는다

특정 날짜가 주어지면 그 달의 마지막 일요일인지 확인할 수 있나요?

일반적인 질문보다는

특정 달이 주어지면 마지막 일요일은 언제입니까?

이를 고려하면 문제를 두 부분으로 나눌 수 있습니다.

  • 날짜는 일요일인가요?
  • 이번달 마지막주인가요?

첫 번째 부분의 테스트는 간단합니다.

date -d "$date" +%a  # outputs "Sun" for a Sunday

우리는 이것을 테스트할 수 있습니다:

test $(date -d "$date" +%a) = Sun  # success if $date is a Sunday

이제 매월 마지막 주인지 테스트하기 위해 날짜에 주를 추가하고 이것이 다음 달의 처음 7일 중 하나인지 확인할 수 있습니다.

test $(date -d "$date + 1week" +%e) -le 7

의 근무일이 $date + 1week의 근무일과 동일하므로 $date테스트의 두 부분을 동시에 생성하고 Bash 정규식을 사용하여 테스트할 수 있습니다.

if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
    echo "$date is the last Sunday of the month!"
fi

시험:

$ ./330571.sh 2016-12-01
$ ./330571.sh 2016-12-04
$ ./330571.sh 2016-12-25
2016-12-25 is the last Sunday of the month!
$ ./330571.sh 2017-01-28
$ ./330571.sh 2017-01-29
2017-01-29 is the last Sunday of the month!

답변2

다음을 사용하여 cal이 작업을 수행할 수 있습니다 awk.

$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25

설명하다

cal일요일을 첫 번째 열로 하여 이번 달을 인쇄합니다(기본값).

$ cal
    December 2016
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

awk명령은 0개 이상의 공백으로 시작하고 뒤에 숫자가 오는 줄을 일치시키고 첫 번째 필드를 변수에 저장합니다 d. 드디어 d매월 마지막 일요일이 됩니다.

답변3

마지막 목요일을 맞이하려고 하다가 이 글을 발견했는데, 이는 다른 날에도 적용됩니다. 내 솔루션은 다음과 같습니다(Bash와 호환 가능).

thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...

기본적으로 다음 주가 같은 달에 발생하는지 확인합니다. or 를 사용하고 -ne있으므로 12월/1월 전환에 맞춰 작동해야 합니다 .-ge-gt

답변4

매월 마지막 일요일:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]

매월 첫째 일요일:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]

관련 정보