Как найти определенное количество дней в диапазоне дат, используя bash? - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу найти третий четверг в диапазоне дат, используя 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 + третий четверг"не работает,

Но использование одной даты с «третьим четвергом» работает:

date -d "third Thursday" +%F

1 Ответ

0 голосов
/ 26 апреля 2018

Этот код находит третий четверг после заданной даты.

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