Вывод, если 10-дневный период закончен - PullRequest
0 голосов
/ 04 октября 2019

Я хочу написать скрипт bash, который определяет, что 10-дневный период (декада) закончился относительно даты начала (в формате ГГГГ-ММ-ДД). Если 10-дневный период закончен, скрипт должен вывести 10-дневный период. Я новичок в Bash и имеет много синтаксических ошибок с кодом, помогите мне, пожалуйста.

#!/bin/bash
# GNU bash, version 4.3.46

CURRENT_DATE=$(date +%Y-%m-%d)
START_DATE=2019-01-01

IS_TODAY_DECADE_CALCULATION_DAY = (CURRENT_DATE - START_DATE) % 10

if [ $IS_TODAY_DECADE_CALCULATION_DAY -eq 0 ]
then
  BEGIN_DATE = $("$CURRENT_DATE - 11 days" +%Y-%m-%d)"
  END_DATE = $("$CURRENT_DATE - 1 day" +%Y-%m-%d)"

  echo "Period is="$BEGIN_DATE":"$END_DATE"
else
  echo "Decade is not finished."
fi

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Вопрос подразумевает, что код должен идентифицировать каждый 10-дневный период, начиная с определенного START_DATE. У Bash нет математики даты - он не может рассчитать разницу между датами (как ожидалось '(CURRENT_DATE - START_DATE)'). Два варианта

  1. Преобразование даты в секунды с начала эпохи Unix и вычисление этих значений, ИЛИ
  2. Использование пакета утилит даты, ИЛИ
  3. с использованием Python, awkperl

Реализация №1 проста. Обратите внимание на несколько изменений в присваиваниях - в частности, в присваиваниях не допускаются пробелы: переменная = выражение, или пусть переменная = выражение

#! /bin/bash

CURRENT_DATE=$(date +%Y-%m-%d)
START_DATE=2019-01-01
# Instead of IS_TODAY_DECADE_CALCULATION_DAY = (CURRENT_DATE - START_DATE) % 10

SEC_IN_DAY=$((60*60*24))
let D1=$(date '+%s' -d "$CURRENT_DATE Z")/SEC_IN_DAY
let D2=$(date '+%s' -d "$START_DATE Z")/SEC_IN_DAY
let IS_TODAY_DECADE_CALCULATION_DAY=(CURRENT_DATE-START_DATE)%10

# Rest of script here
if [ $IS_TODAY_DECADE_CALCULATION_DAY -eq 0 ]
then
  BEGIN_DATE=$(date -d "$CURRENT_DATE - 11 days" +%Y-%m-%d)
  END_DATE=$(date -d "$CURRENT_DATE - 1 day" +%Y-%m-%d)

  echo "Period is=$BEGIN_DATE:$END_DATE"
else
  echo "Decade is not finished."
fi
0 голосов
/ 04 октября 2019

Вы должны сравнить метки времени Unix. Если отметка времени «сейчас + 10 дней» больше даты начала, период заканчивается.

#! /bin/bash

DATE_OLD=$(date "+%F" -d "-11 days")
DATE_NOW=$(date "+%F")

TEST_DATE_NOW=$(date "+%s" -d ${DATE_NOW})
TEST_DATE_OLD=$(date "+%s" -d ${DATE_OLD})

DIVIDER=$(( (TEST_DATE_NOW - TEST_DATE_OLD) / (60*60*24) ))
REMAINING=$(( DIVIDER % 10 ))

echo "Days between ${DATE_OLD} and ${DATE_NOW} is $DIVIDER"

if [ ${DIVIDER} -gt 0 ]; then
        echo "Date ${DATE_OLD} is in the past"
else
        echo "Date ${DATE_OLD} is in the future"
fi

if [ $REMAINING -eq 0 ]; then
        echo "Ten days period ended"
else
        echo "Still in ten day period"
fi

exit 0;
...