"Для затравки" привожу собственный вариант реализации функции, возвращающей системную дату по состоянию на "день вчерашний", т.е. попросту функцию 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..."!
man date:
date -d yesterday
Re: Внимание, конкурс "Вчера был BASH..."!
Хм... это есть только в info date. Эх, Исаков, такую идею загубил!
Интересно, а есть способ получить системное время не от команды date? Я так посмотрел список встроенных переменных BASH - ни $DATE, ни даже $TIME среди них нет, так что... неужели и правда без вызова внешней команды никак не обойтись?
Re: Внимание, конкурс "Вчера был BASH..."!
Эта идея противоречит идеологии shell програмирования между прочим! Идея shell-то не в том, чтобы все писать на этом языке, а чтобы управлять другими инструментами.
Есть один трюк, но он не совсем по теме.
Re: Внимание, конкурс "Вчера был BASH..."!
а вот и нет...
......
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
Внимание, конкурс "Вчера был BASH..."!
И что? Вы смысл этой опции интуитивно просекли? Я, вот, например, понятия не имел о том, что здесь можно указывать yesterday, tomorrow и т.д. Ведь о собственно формате строки и сокращениях в man'е ничегошеньки не сказано.
Re: Внимание, конкурс "Вчера был BASH..."!
мало того... я лично немало обалдел, когда первый раз увидел ответ на вот такой запрос:
конструкции '2 weeks ago' и '2 months ago' тоже прекрасно отрабатывают
еще и параметры форматирования вывода при этом остаются работоспособными...
кстати, раз уж мы рассмотрели возможность такой работы команды date, то вот более усложненная задачка...
дано: время события из какого либо лога в формате +%s, например "1168760106"
нужно: получить из ЭТОГО дату и время в human-friendly виде, например "Вск Янв 14 09:36:58 EET 2007".
сразу говорю, что первое "например" второму не соответствует
Re: Внимание, конкурс "Вчера был BASH..."!
date -d @1168760106
Re: Внимание, конкурс "Вчера был BASH..."!
увы...
при проверке использовал "copy/paste"...
Re: Внимание, конкурс "Вчера был BASH..."!
Re: Внимание, конкурс "Вчера был BASH..."!
опять увы
---
[wildcat@basilio wildcat]$ date --version
date (GNU sh-utils) 2.0.11
---
Re: Внимание, конкурс "Вчера был BASH..."!
Тогда счастливого вам апгрейда!
Re: Внимание, конкурс "Вчера был BASH..."!
Тогда счастливого вам апгрейда!
ну это неспортивно
задача решаема и в моих условиях... причем есть подозрение, что мой вариант будет работать на любой из текущих версий date.
Re: Внимание, конкурс "Вчера был BASH..."!
Юзать последнюю версию Gentoo очень даже спортивно!

А апгрейдиться все-равно иногда надо!