Respuestas:
Puede usar date
el código de salida de 's para verificar un año bisiesto, confiando en date
el comportamiento de generar un código de salida que no sea 0 para una fecha no válida, obviamente no hay 29 de febrero en un año no bisiesto:
date -d $year-02-29 &>/dev/null
echo $?
como una función:
isleap() { date -d $1-02-29 &>/dev/null && echo is leap || echo is not leap; }
Uso:
$ isleap 2019
is not leap
$ isleap 2020
is leap
Con respecto a tu pregunta:
¿Cómo puedo saber cuáles son los años bisiestos entre 2014 y 2020 en un terminal Linux?
echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
date -d $y-02-29 &>/dev/null && echo $y;
done
Solo una variante de la respuesta de @ RoVo ...
for a in {2014..2020}
do
date -d $a-02-29 +"%Y" 2>/dev/null
done
date -d $a-02-29 +"%Y" 2> /dev/null
establece la fecha al 29 de febrero e imprime el año, ignorando cualquier error que ocurra.
seq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Aquí en Stack Overflow, anubhava proporcionó una solución elegante :
#!/bin/bash (( !($1 % 4) && ( $1 % 100 || !( $1 % 400) ) )) && echo "leap year" || echo "not a leap" exit 0
Guarde lo anterior en un archivo de texto llamado isleap
.
No olvide configurar el permiso de ejecución:
chmod +x isleap
Pruébalo:
$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
date
comando son hacks.
Si no desea confiar en algunas propiedades "arcanas" incidentales de los años bisiestos (como su divisibilidad, la cantidad de días en un año o la existencia de un día específico), debe usar un lenguaje de programación con una biblioteca de calendario adecuada función. Recomiendo Python 1, 2 :calendar.isleap()
#!/usr/bin/python3
import sys
import traceback
import calendar
try:
year = int(sys.argv[1])
is_leap = calendar.isleap(year)
except:
traceback.print_exc()
sys.exit(2)
print(is_leap) # Print the year’s leap status
sys.exit(not is_leap) # Exit program with "success" if leap and "failure" otherwise
Uso:
$ python3 is_leap.py 2000
True
$ python3 is_leap.py 2100
False
O como una línea (sin el manejo adecuado de errores):
$ python3 -c 'import sys, calendar; print(calendar.isleap(int(sys.argv[1])))' 2000
True
$ python3 -c 'import sys, calendar; sys.exit(not calendar.isleap(int(sys.argv[1])))' 2000
$ echo $?
0
1 Estoy seguro de que hay una solución Perl equivalente simple.
2 El calendar
módulo de Python utiliza el calendario gregoriano proleptico , es decir, extiende el calendario G. indefinidamente al pasado y al futuro. No tiene en cuenta que el calendario G. solo entró en vigencia en 1582 o que algunos locales continúan usando otros calendarios con diferentes reglas de año bisiesto. Si necesita soporte para otros calendarios, por ejemplo, el calendario juliano, le recomiendo que instale y use un módulo de extensión Python apropiado.
def isleap(year):
"""Return True for leap years, False for non-leap years."""
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
. Mismo fct. como se usa en askubuntu.com/a/1081237/790920