linux - 如何使用 bash 查找日期范围内的特定日期?

标签 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 Friday”效果不佳,

但是单独使用日期和“第三个星期四”是有效的:

date -d "third Thursday" +%F

最佳答案

此代码查找给定日期之后的第三个星期四。

#!/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

关于linux - 如何使用 bash 查找日期范围内的特定日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028979/

相关文章:

bash - 通配符单个文件

regex - 通过 Shell 脚本根据表格列从 HTML 中提取文本

linux - git: 'pull' 不是 git 命令 - CentOS VPS 服务器

linux - 如何执行完全安静的 'make' ,仅输出日志文件?

linux - 在树莓派上永久更改 xmodmap

json - 对一个 JSON 模板进行多项更改

linux - bash脚本: options - case: range of multiple numbers

bash - 在正则表达式中的字符类中使用方括号

linux - Bash !$ 相当于第一个词

bash - 这些 shell 脚本字符 ( || : ) doing anything useful?