
tento escrever um script no ESXI e preciso adicionar "se for o último domingo do mês". eu tento
date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d
Pode não funcionar, mas funciona no Debian.
No ESXI agora sai em agosto
Responder1
Acredito que a questão seja
Dada uma data específica, posso determinar se é o último domingo do mês?
e não a questão mais geral
Dado um determinado mês, em que dia é o seu último domingo?
Diante disso, podemos dividir o problema em dois:
- A data é domingo?
- É a última semana do mês?
Para a primeira parte, o teste é bastante fácil:
date -d "$date" +%a # outputs "Sun" for a Sunday
Podemos testar isso:
test $(date -d "$date" +%a) = Sun # success if $date is a Sunday
Agora, para testar se é a última semana do mês, podemos adicionar uma semana à data e ver se isso nos dá um dos primeiros 7 dias do próximo mês:
test $(date -d "$date + 1week" +%e) -le 7
Como o dia da semana de $date + 1week
é igual ao de $date
, podemos gerar ambas as partes do teste de uma só vez e usar um teste de expressão regular Bash:
if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
echo "$date is the last Sunday of the month!"
fi
Testado:
$ ./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!
Responder2
Você pode fazer isso com cal
e awk
:
$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25
Explicação
cal
imprime o mês atual com domingo como primeira coluna (por padrão):
$ 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
O awk
comando corresponde a linhas que começam com zero ou mais espaços, seguidos por um dígito, e armazena o primeiro campo na variável d
. No final, d
será o último domingo do mês corrente.
Responder3
Encontrei este artigo ao tentar obter a última quinta-feira, mas funcionaria em qualquer outro dia também. Aqui está minha solução (compatível com Bash):
thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...
Essencialmente, verifica se o dia da próxima semana ocorre no mesmo mês. Deve funcionar para transições dezembro/janeiro, já que usei -ne
em vez de -ge
or -gt
.
Responder4
Para o último domingo do mês:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]
Para o primeiro domingo do mês:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]