Вчера был 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..."!

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

Аватар пользователя IsakovAN

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

DRVTiny писал(а):
Хм... это есть только в info date. Эх, Исаков, такую идею загубил! Улыбка

Эта идея противоречит идеологии shell програмирования между прочим! Идея shell-то не в том, чтобы все писать на этом языке, а чтобы управлять другими инструментами.

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

Есть один трюк, но он не совсем по теме. Улыбка

Аватар пользователя wildsin

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

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

Аватар пользователя DRVTiny

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

Цитата:
-d, --date=STRING
display time described by STRING, not `now'

И что? Вы смысл этой опции интуитивно просекли? Я, вот, например, понятия не имел о том, что здесь можно указывать yesterday, tomorrow и т.д. Ведь о собственно формате строки и сокращениях в man'е ничегошеньки не сказано.

Аватар пользователя wildsin

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

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".
сразу говорю, что первое "например" второму не соответствует Улыбка

Аватар пользователя IsakovAN

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

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

date -d @1168760106

Аватар пользователя wildsin

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

IsakovAN писал(а):
date -d @1168760106

увы...

Цитата:
[wildcat@basilio wildcat]$ date -d @1168760106
date: дата `@1168760106' задана неправильно

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

Аватар пользователя IsakovAN

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

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..."!

IsakovAN писал(а):
alex@ian ~ $ date --version
date (GNU coreutils) 6.7

опять увы Улыбка
---
[wildcat@basilio wildcat]$ date --version
date (GNU sh-utils) 2.0.11
---

Аватар пользователя IsakovAN

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

wildsin писал(а):
[wildcat@basilio wildcat]$ date --version
date (GNU sh-utils) 2.0.11

Тогда счастливого вам апгрейда! Улыбка

Аватар пользователя wildsin

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

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
Аватар пользователя IsakovAN

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

wildsin писал(а):
ну это неспортивно Улыбка

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

RSS-материал