如果 10 天期限结束则输出

Outputting if the 10 day period is finished

我想编写一个 bash 脚本来确定相对于开始日期(格式为 YYYY-MM-DD)的 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

你应该比较 unix 时间戳。如果时间戳 "now+10 days" 大于开始日期,则该期间结束。

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

这个问题意味着代码应该识别从特定 START_DATE 开始的每 10 天的时间段。 Bash 没有日期数学 - 它无法计算日期之间的差异(如 '(CURRENT_DATE - START_DATE)' 所预期的那样)。两个选项

  1. 将日期转换为自 Unix 纪元以来的秒数,并对这些值进行数学计算,或者
  2. 使用日期实用程序包,或者
  3. 使用 Python、awk、perl

实施#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