
Intento escribir un script en ESXI y necesito agregar "si es el último domingo del mes". lo intento
date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d
No puede funcionar, pero funciona en Debian.
En ESXI ahora sale agosto
Respuesta1
Creo que la pregunta es
Dada una fecha en particular, ¿puedo determinar si es el último domingo del mes?
y no la pregunta más general
Dado un mes en particular, ¿qué día es su último domingo?
Teniendo esto en cuenta, podemos dividir el problema en dos:
- ¿La fecha es domingo?
- ¿Es la última semana del mes?
Para la primera parte, la prueba es bastante sencilla:
date -d "$date" +%a # outputs "Sun" for a Sunday
Podemos probar eso:
test $(date -d "$date" +%a) = Sun # success if $date is a Sunday
Ahora, para probar si es la última semana del mes, podemos agregar una semana a la fecha y ver si eso nos da uno de los primeros 7 días del próximo mes:
test $(date -d "$date + 1week" +%e) -le 7
Dado que el día de la semana de $date + 1week
es el mismo que el de $date
, podemos generar ambas partes de la prueba de una vez y usar una prueba de expresión regular de Bash:
if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
echo "$date is the last Sunday of the month!"
fi
Probado:
$ ./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!
Respuesta2
Puedes hacer esto con cal
y awk
:
$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25
Explicación
cal
imprime el mes actual con el domingo como primera columna (por defecto):
$ 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
El awk
comando busca líneas que comiencen con cero o más espacios, seguidas de un dígito, y almacena el primer campo en la variable d
. Al finalizar, d
será el último domingo del mes en curso.
Respuesta3
Encontré este artículo cuando intentaba obtener el último jueves, pero también funcionaría para cualquier otro día. Aquí está mi solución (compatible con Bash):
thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...
Básicamente, comprueba si el día de la próxima semana ocurre en el mismo mes. Debería funcionar para las transiciones de diciembre/enero, ya que usé -ne
en lugar de -ge
o -gt
.
Respuesta4
Para el último domingo del mes:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]
Para el primer domingo del mes:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]