如何使用bash在一系列日期中查找特定的一天?

时间:2018-04-25 18:21:56

标签: linux bash shell ubuntu redhat

我想使用bash在一系列日期中搜索第三个星期四。

这是我的代码:

#!/bin/bash
start=2018-03-23
end=2018-04-22
while ! [[ $start > $end ]]; do
    echo $start
    start=$(date -d "$start+third Thursday" +%F)
done

看起来最后一部分“$ start + third Thursday”效果不佳,

但仅使用日期和“第三个星期四”的作品:

date -d "third Thursday" +%F

1 个答案:

答案 0 :(得分:1)

此代码在给定日期之后找到第三个星期六。

#!/bin/bash
start=2018-04-24
thursdayOfCurrentWeek=$((4-$( date +%u --date $start )))
if [[ $thursdayOfCurrentWeek -ge 0 ]]
then
    date -d "$start + $thursdayOfCurrentWeek days + 2 weeks" +%F
else
    date -d "$start + $thursdayOfCurrentWeek days + 3 weeks" +%F
fi

让我们把它分开:

date +%u --date $start

这会将$start的工作日作为数字返回(1 =星期一,...,4 =星期四)。

$((4-$( date +%u --date $start )))

这会计算添加到$start日期的天数,以获得当周的星期四。

if [[ $thursdayOfCurrentWeek -ge 0 ]]

如果星期四的日期是今天或本周晚些时候,则在下周四只增加2周,因为它已经是接下来的3个星期四之一。

date -d "$start + $thursdayOfCurrentWeek days + 2 weeks" +%F
# or
date -d "$start + $thursdayOfCurrentWeek days + 3 weeks" +%F

添加或减去$start日期以获取当前周的星期四,并根据本周四的时间增加2或3周。

如果$start日期是星期四,并且它不应该算作三者中的一个,只需将if语句替换为:

if [[ $thursdayOfCurrentWeek -gt 0 ]]

这是一个更一般的答案(因为开始日期不一定是星期五)然后你正在寻找什么,但它也适用于你的用例。

希望这有帮助。

PS您不需要$end日期。

编辑:

如果您真的想要最小版本,如果$start总是星期五,您可以这样做:

#!/bin/bash
start=2018-03-23
date -d "$start - 1 day + 3 weeks" +%F