昨天日期(最后一个工作日)的bash shell脚本

时间:2011-03-21 21:26:05

标签: bash date

我正在编写一个bash脚本,需要打印最后一个工作日的日期。因此,例如,如果脚本在星期一运行,它将打印上周五的日期。

我发现这打印在昨天的日期:

date -d '1 day ago' +'%Y/%m/%d'

我也知道我可以使用此声明来获取星期几

date +%w

我想结合这两个语句,以便有一个打印所需日期的辅助脚本。逻辑是这样的(注意:它的伪代码 - 我从来没有写过bash脚本)

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上运行)

6 个答案:

答案 0 :(得分:17)

你是如此亲密:

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'

答案 1 :(得分:6)

周日也需要检查。

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'

答案 2 :(得分:3)

我正在使用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 :(得分:2)

将其他答案放在一起,我想到了:

last_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")

    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 "${from_date} - ${look_back} day" +'%Y/%m/%d'
}

next_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")
    if [ ${day_of_week} = "5" ] ; then
        look_forward=3
    elif [ ${day_of_week} = "6" ] ; then
        look_forward=2
    else
        look_back=1
    fi

    date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}

for i in $(seq 16); do
    now=$(date +'%Y/%m/%d' --date="today + ${i} day")
    prev=$(last_workday "${now}")
    next=$(next_workday "${now}")
    echo "${now}:  ${prev} ${next}"
done

答案 4 :(得分:1)

使用bash内联“三元”表达式的更简洁形式:

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

答案 5 :(得分:0)

对于OSX(在10.9.2和10.13.4上测试),可能是您使用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"