Вчера был BASH...

Изображение пользователя DRVTiny.
Опубликовано:
Раздел:

"Для затравки" привожу собственный вариант реализации функции, возвращающей системную дату по состоянию на "день вчерашний", т.е. попросту функцию yesterday (исполняется под аккомпанемент группы Битлз):

yesterday () {
# 12 1 2 3 4 5 6 7 8 9 10 11
ndaysInMonth=(1 1 -2 1 0 1 0 1 1 0 1 0)
curYear="`date +%Y`"
lastYear=$curYear
curMonth="`date +%m | sed 's%^0%%'`"
curDay="`date +%d | sed 's%^0%%'`"
if [ $curDay -eq 1 ]; then
lastMonth=$((curMonth-1))
lastDay=$((30+${ndaysInMonth[$lastMonth]}))
if [ $curMonth -eq 3 ]; then
[ $(($((2008-$curYear))%4)) -ne 0 ]
let lastDay+=$?
elif [ $curMonth -eq 1 ]; then
lastYear=$((curYear -1))
lastMonth=12
fi
else
lastMonth=$curMonth
lastDay=$((curDay-1))
fi
for v in lastMonth lastDay; do eval $v="`echo \"${!v}\" | sed 's%^[1-9]$%0&%'`"; done
echo "$lastYear/$lastMonth/$lastDay"
return 0
}

Если кто-нибудь сможет предложить интересные оптимизации по размеру и скорости исполнения кода - "ласкаво просимо", объявляю конкурс на самую короткую И/ИЛИ быструю реализацию функции yesterday (но лучше всё-таки И, чем ИЛИ, хотя все истинные низкоуровневые программёры знают наверняка, что так не бывает) открытым... Призы в этом конкурсе в виде общественного признания заслуг, морального удовлетворения, а также новых сакральных знаний - получают ВСЕ участники и даже просто сторонние наблюдатели! Улыбка
Единственное существенное условие и ограничение "в одном лице": код должен быть полностью на BASH и по возможности ограничиваться функционалом оболочки, не используя сторонние утилиты обработки текста (например, я уже штрафное очко получаю за то, что sed применил для удаления и простановки на место ведущих нулей, а также date - для получения системной даты).


Эй, оператор-астроном,

Нет звёзд и звёздных глаз -

Есть плац, пивная, гастроном

И горы из колбас!

Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"

Изображение пользователя DRVTiny.

Re: Внимание, конкурс "Вчера был BASH..."! #2

Хм... это есть только в info date. Эх, Исаков, такую идею загубил! Улыбка
Интересно, а есть способ получить системное время не от команды date? Я так посмотрел список встроенных переменных BASH - ни $DATE, ни даже $TIME среди них нет, так что... неужели и правда без вызова внешней команды никак не обойтись?


Эй, оператор-астроном,
Нет звёзд и звёздных глаз -
Есть плац, пивная, гастроном
И горы из колбас!

Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"

Изображение пользователя IsakovAN.

Re: Внимание, конкурс "Вчера был BASH..."! #3

DRVTiny писал(а):
Хм... это есть только в info date. Эх, Исаков, такую идею загубил! Улыбка
Эта идея противоречит идеологии shell програмирования между прочим! Идея shell-то не в том, чтобы все писать на этом языке, а чтобы управлять другими инструментами.
DRVTiny писал(а):
Интересно, а есть способ получить системное время не от команды date? Я так посмотрел список встроенных переменных BASH - ни $DATE, ни даже $TIME среди них нет, так что... неужели и правда без вызова внешней команды никак не обойтись?
Есть один трюк, но он не совсем по теме. Улыбка

Изображение пользователя wildsin.

Re: Внимание, конкурс "Вчера был BASH..."! #4

DRVTiny писал(а):
Хм... это есть только в info date.
а вот и нет... ...... Display the current time in the given FORMAT, or set the system date.

-d, --date=STRING
display time described by STRING, not `now'
......
то же самое в русском мане:
......
Показывает текущее время в заданном ФОРМАТЕ, или
устанавливает системную дату и время.

-d, --date=СТРОКА
показывает время, описанное СТРОКОЙ - не 'текущее'
время
......
маны от АСП 7 какого-то...
[wildcat@basilio man1]$ ll date*
-rw-r--r-- 1 root root 2328 Фев 6 2003 date.1.gz


--
bye.

Изображение пользователя DRVTiny.

Внимание, конкурс "Вчера был BASH..."! #5

Цитата:
-d, --date=STRING display time described by STRING, not `now'
И что? Вы смысл этой опции интуитивно просекли? Я, вот, например, понятия не имел о том, что здесь можно указывать yesterday, tomorrow и т.д. Ведь о собственно формате строки и сокращениях в man'е ничегошеньки не сказано.


Эй, оператор-астроном,
Нет звёзд и звёздных глаз -
Есть плац, пивная, гастроном
И горы из колбас!

Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"

Изображение пользователя wildsin.

Re: Внимание, конкурс "Вчера был BASH..."! #6

DRVTiny писал(а):
Я, вот, например, понятия не имел о том, что здесь можно указывать yesterday, tomorrow и т.д.
мало того... я лично немало обалдел, когда первый раз увидел ответ на вот такой запрос:
Цитата:
[wildcat@basilio /usr]$ date Срд Мар 14 09:27:24 EET 2007 [wildcat@basilio /usr]$ date -d '2 days ago' Пнд Мар 12 09:27:37 EET 2007
конструкции '2 weeks ago' и '2 months ago' тоже прекрасно отрабатывают Улыбка еще и параметры форматирования вывода при этом остаются работоспособными...

кстати, раз уж мы рассмотрели возможность такой работы команды date, то вот более усложненная задачка...
дано: время события из какого либо лога в формате +%s, например "1168760106"
нужно: получить из ЭТОГО дату и время в human-friendly виде, например "Вск Янв 14 09:36:58 EET 2007".
сразу говорю, что первое "например" второму не соответствует Улыбка


--
bye.

Изображение пользователя IsakovAN.

Re: Внимание, конкурс "Вчера был BASH..."! #7

wildsin писал(а):
дано: время события из какого либо лога в формате +%s, например "1168760106" нужно: получить из ЭТОГО дату и время в human-friendly виде, например "Вск Янв 14 09:36:58 EET 2007".
date -d @1168760106

Изображение пользователя wildsin.

Re: Внимание, конкурс "Вчера был BASH..."! #8

IsakovAN писал(а):
date -d @1168760106
увы...
Цитата:
[wildcat@basilio wildcat]$ date -d @1168760106 date: дата `@1168760106' задана неправильно
при проверке использовал "copy/paste"...


--
bye.

Изображение пользователя IsakovAN.

Re: Внимание, конкурс "Вчера был BASH..."! #9

wildsin писал(а):
при проверке использовал "copy/paste"...

Цитата:
alex@ian ~ $ date -d @1168760106 Вск Янв 14 10:35:06 MSK 2007 alex@ian ~ $ date --version date (GNU coreutils) 6.7

Изображение пользователя wildsin.

Re: Внимание, конкурс "Вчера был BASH..."! #10

IsakovAN писал(а):
alex@ian ~ $ date --version date (GNU coreutils) 6.7
опять увы Улыбка --- [wildcat@basilio wildcat]$ date --version date (GNU sh-utils) 2.0.11 ---


--
bye.

Изображение пользователя IsakovAN.

Re: Внимание, конкурс "Вчера был BASH..."! #11

wildsin писал(а):
[wildcat@basilio wildcat]$ date --version date (GNU sh-utils) 2.0.11
Тогда счастливого вам апгрейда! Улыбка

Изображение пользователя wildsin.

Re: Внимание, конкурс "Вчера был BASH..."! #12

IsakovAN писал(а):
wildsin,
Цитата:
[wildcat@basilio wildcat]$ date --version date (GNU sh-utils) 2.0.11
Тогда счастливого вам апгрейда!
ну это неспортивно Улыбка задача решаема и в моих условиях... причем есть подозрение, что мой вариант будет работать на любой из текущих версий date.
Цитата:
[wildcat@basilio wildcat]$ date -d "1970-01-01 1137575520 sec" Срд Янв 18 08:12:00 EET 2006


--
bye.

Изображение пользователя IsakovAN.

Re: Внимание, конкурс "Вчера был BASH..."! #13

wildsin писал(а):
ну это неспортивно Улыбка
Юзать последнюю версию Gentoo очень даже спортивно! Улыбка А апгрейдиться все-равно иногда надо! Улыбка