Bash shell script для датой дня (последний рабочий день)

Я пишу 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)

Ответ 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'

Ответ 2

Я использую 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

Ответ 3

В воскресенье также необходимо проверить.

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'

Ответ 4

Более краткая форма с использованием bash встроенного "тройного" выражения:

[[ $(date +%w) == 1 ]] && days=3 || days=1
date -d "$days day ago" +"%Y-%m-%d"

Ответ 5

Для 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"