Eu acredito que a questão é
Given a particular date, can I determine whether it is the last Sunday in the month?
e não a questão mais geral
Given a particular month, on what day is its last Sunday?
Dado que, podemos dividir o problema em dois:
- A data é um 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 as duas 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!