Календарь расчетов в bash - PullRequest
       16

Календарь расчетов в bash

3 голосов
/ 01 апреля 2009

Я хочу сделать некоторые манипуляции с календарем в bash - в частности, я хочу выяснить последнюю дату данного месяца (включая високосный год, и подготовка таблицы для поиска не является для меня правильным решением).

Возможно, у меня есть следующий код:

$year=2009
$start_month=2
$end_month=10
for $month in $(seq $start_month $end_month); do
  echo "Last date of "$(date +"%B" -d "${year}-${month}-01")" is: " ???
done

Я не могу понять, как сделать что-то подобное. Хотя я date -d работал бы как POSIX mktime и сбрасывал недействительные даты в их действительные эквиваленты, поэтому я мог бы сказать что-то вроде date -d "2009-03-00" и получить '2009-02-28', но такой удачи нет.

Есть ли способ сделать это, используя только то, что доступно на bash в стандартной среде GNU?

Ответы [ 4 ]

6 голосов
/ 01 апреля 2009

Попробуйте: date -d 'yesterday 2009-03-01'

Интуитивно я знаю. Более ранние версии даты использовались для работы с POSIX.

5 голосов
/ 01 апреля 2009

date (1) 's -d является специфическим для GNU; поэтому его использование будет работать только на GNU Linux.

Более переносимое решение (это должно работать даже в sh AFAIK), это:

: $(cal 4 2009); echo $_
3 голосов
/ 01 апреля 2009

Если вы не против поиграть с grep / awk / perl, вы можете взглянуть на cal.

$ cal 4 2009
     April 2009
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

Редактировать (MarkusQ): Чтобы отменить мое решение шутки ниже, я внесу свой вклад в ваше:

cal 4 2009 | tr ' ' '\n' | grep -v ^$ | tail -n 1
1 голос
/ 01 апреля 2009

Ну, одним из способов было бы наблюдать текущую дату в цикле, пока не изменится компонент месяца, сохранив компонент дня для одного раунда. Это даст вам как первый, так и последний день месяца, но это может быть слишком медленно.

Опубликовано 1 апреля 2009 г.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...