Как я могу узнать, которые являются високосными годами между 2014 и 2020 в терминале Linux?
Есть ли любой способ использовать некоторый код как $cal
- что-нибудь для показа, какие годы являются високосными годами между 2014 и 2020 немедленно?
Просто вариант ответа @ 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
устанавливает дату 29 февраля и печатает год, игнорируя любые ошибки.
Можно использовать date
код выхода для проверки в течение високосного года, полагаясь date
поведение генерации не 0 кодов выхода для недопустимой даты, obviosuly существует не 29-го февраля в невисокосный год:
date -d $year-02-29 &>/dev/null
echo $?
как функция:
isleap() { date -d $1-02-29 &>/dev/null && echo is leap || echo is not leap; }
Использование:
$ isleap 2019
is not leap
$ isleap 2020
is leap
Относительно Вашего вопроса:
Как я могу узнать, которые являются високосными годами между 2014 и 2020 в терминале Linux?
echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
date -d $y-02-29 &>/dev/null && echo $y;
done
Здесь на Переполнении стека, изящное решение было предоставлено anubhava:
#!/bin/bash (( !($1 % 4) && ( $1 % 100 || !( $1 % 400) ) )) && echo "leap year" || echo "not a leap" exit 0
Сохраните вышеупомянутое в названные текстовые файлы isleap
.
Не забывайте устанавливать, выполняют разрешение:
chmod +x isleap
Протестируйте его:
$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
Если Вы не хотите полагаться на некоторые несущественные “тайные” свойства високосных годов (как их делимость, количество дней через год или существование определенного дня), необходимо использовать язык программирования с соответствующей календарной библиотечной функцией. Я рекомендую Python calendar.isleap()
1, 2:
#!/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
Использование:
$ python3 is_leap.py 2000
True
$ python3 is_leap.py 2100
False
Или как острота (без надлежащей обработки ошибок):
$ 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 я уверен, что существует простое эквивалентное решение для Perl.
2 Python calendar
модуль использует преждевременный Григорианский календарь, т.е. он расширяет календарь G. неограниченно долго в прошлое и будущее. Это не принимает во внимание, что календарь G. только вступил в силу в 1582 или что некоторые локали продолжают использовать другие календари с различными правилами високосного года. Если Вы нуждаетесь в поддержке для других календарей, например, юлианского календаря, я рекомендую, чтобы Вы установили и использовали соответствующий модуль расширения Python.