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) ]]