Respuestas:
Puede usar dateel código de salida de 's para verificar un año bisiesto, confiando en dateel 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
datecomando 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 calendarmó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