
Я пытаюсь написать скрипт на ESXI и мне нужно добавить "если последнее воскресенье месяца". Я пытаюсь
date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d
Это может не работать, но работает на Debian.
На ESXI сейчас выводится август
решение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
сопоставляет строки, начинающиеся с нуля или более пробелов, за которыми следует цифра, и сохраняет первое поле в переменной d
. В конце d
будет последнее воскресенье текущего месяца.
решение3
Я нашел эту статью, когда пытался получить последний четверг, но она сработает и для любого другого дня. Вот мое решение (совместимое с Bash):
thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...
По сути, он проверяет, находится ли день на следующей неделе в том же месяце. Должно работать для переходов Дек/Янв, так как я использовал -ne
вместо -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) ]]