#!/bin/bash
# Our given dates
dates=(
20190315
20180217
20170914
)
# Loop over the given dates
for thedate in "${dates[@]}"; do
# Get day of the week as digit (1 is Monday, 7 is Sunday)
day=$( date -d "$thedate" +%u )
# The Monday the same week is $(( day - 1 )) days earlier than the given date.
# The Monday two weeks earlier is 14 days earlier still.
date -d "$thedate -$(( day - 1 + 14 )) days" +"$thedate --> %Y%m%d"
done
Выход:
20190315 --> 20190225
20180217 --> 20180129
20170914 --> 20170828
Трудность в этом заключается в том, чтобы выяснить, как построить правильную строку --date
или -d
для GNU date
для вычисления окончательной даты. Я решил вычислить день недели для заданной даты, а затем использовать его для вычисления строки даты, которая смещает заданную дату на количество дней, так что результирующей датой является понедельник двумя неделями ранее.
Фактические строки, которые в конечном итоге используются для аргумента опции -d
в приведенном выше скрипте с использованием дат, указанных в скрипте, это
20190315 -18 days
20180217 -19 days
20170914 -17 days
Сжатие сценария в единую команду, которая выполняет вычисления для одной даты в$thedate
:
date -d "$thedate -$(date -d "$thedate" +%u) days -13 days" +%Y%m%d
или
date -d "$thedate -$(date -d "$thedate" +"-%u days -13 days")" +%Y%m%d
Вы можете исправить это, вернувшись к соответствующей версии libstdc++6
для вашего дистрибутива:
sudo apt install libstdc++6=8.4.0-1ubuntu1~18.04
libstdc++6
является системной библиотекой, и ее несколько сложно обновить.