Ответ 1
Вы были так близки:
day_or_week=`date +%w`
if [ $day_or_week == 1 ] ; then
look_back=3
else
look_back=1
fi
date -d "$look_back day ago" +'%Y/%m/%d'
Я пишу bash script, который должен печатать дату последнего рабочего дня. Например, если script запущен в понедельник, он напечатает дату в прошлую пятницу.
Я обнаружил, что это печатает дату вчера:
date -d '1 day ago' +'%Y/%m/%d'
Я также знаю, что я могу получить день недели, используя это утверждение
date +%w
Я хочу объединить эти два оператора, чтобы иметь небольшой помощник script, который печатает требуемую дату. Логика идет примерно так (примечание: его псевдокод - я никогда не писал bash script)
DAY_OF_WEEK = `date +%w`
if (%DAY_OF_WEEK == 1)
LOOK_BACK = 3
elif
LOOK_BACK = 1
fi
echo `date -d '%LOOK_BACK day ago' +'%Y/%m/%d'`
Может кто-нибудь помочь, исправив псевдо-код выше?
(я запускаю Ubuntu 10.0.4)
Вы были так близки:
day_or_week=`date +%w`
if [ $day_or_week == 1 ] ; then
look_back=3
else
look_back=1
fi
date -d "$look_back day ago" +'%Y/%m/%d'
Я использую Mac, поэтому моя команда date
не имеет того же флага -d
, который вам кажется, но следующее должно работать, если оно ведет себя так, как вы указали:
if [[ $(date +%w) == 1 ]]
then
LOOK_BACK=3
else
LOOK_BACK=1
fi
date -d "${LOOK_BACK} day ago" +%Y/%m/%d
В воскресенье также необходимо проверить.
DAY_OF_WEEK=`date +%w`
if [ $DAY_OF_WEEK = 0 ] ; then
LOOK_BACK=2
elif [ $DAY_OF_WEEK = 1 ] ; then
LOOK_BACK=3
else
LOOK_BACK=1
fi
date -d "$LOOK_BACK day ago" +'%Y/%m/%d'
Более краткая форма с использованием bash встроенного "тройного" выражения:
[[ $(date +%w) == 1 ]] && days=3 || days=1
date -d "$days day ago" +"%Y-%m-%d"
Для OSX (протестировано на 10.9.2), поэтому, вероятно, в любой среде, где вы используете дату BSD.
if [ 'date +%w' == 1 ] ; then
date -v-3d +'%Y/%m/%d'
else
date -v-1d +'%Y/%m/%d'
fi
Вы можете проверить, используете ли вы дату BSD,
$ man date | grep "BSD General"