"Для затравки" привожу собственный вариант реализации функции, возвращающей системную дату по состоянию на "день вчерашний", т.е. попросту функцию 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 - для получения системной даты).
Внимание, конкурс "Вчера был BASH..."! #1
man date:
date -d yesterday
Re: Внимание, конкурс "Вчера был BASH..."! #2
Хм... это есть только в info date. Эх, Исаков, такую идею загубил!
Интересно, а есть способ получить системное время не от команды date? Я так посмотрел список встроенных переменных BASH - ни $DATE, ни даже $TIME среди них нет, так что... неужели и правда без вызова внешней команды никак не обойтись?
Эй, оператор-астроном,
Нет звёзд и звёздных глаз -
Есть плац, пивная, гастроном
И горы из колбас!
Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"
Re: Внимание, конкурс "Вчера был BASH..."! #3
Re: Внимание, конкурс "Вчера был BASH..."! #4
-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.
Внимание, конкурс "Вчера был BASH..."! #5
Эй, оператор-астроном,
Нет звёзд и звёздных глаз -
Есть плац, пивная, гастроном
И горы из колбас!
Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"
Re: Внимание, конкурс "Вчера был BASH..."! #6
кстати, раз уж мы рассмотрели возможность такой работы команды date, то вот более усложненная задачка...
дано: время события из какого либо лога в формате +%s, например "1168760106"
нужно: получить из ЭТОГО дату и время в human-friendly виде, например "Вск Янв 14 09:36:58 EET 2007".
сразу говорю, что первое "например" второму не соответствует
--
bye.
Re: Внимание, конкурс "Вчера был BASH..."! #7
Re: Внимание, конкурс "Вчера был BASH..."! #8
--
bye.
Re: Внимание, конкурс "Вчера был BASH..."! #9
Re: Внимание, конкурс "Вчера был BASH..."! #10
--
bye.
Re: Внимание, конкурс "Вчера был BASH..."! #11
Re: Внимание, конкурс "Вчера был BASH..."! #12
--
bye.
Re: Внимание, конкурс "Вчера был BASH..."! #13