检查明天是否是该月的第一天在 bash 脚本中失败

检查明天是否是该月的第一天在 bash 脚本中失败

我有一个每天运行的脚本。根据今天是一周中的哪一天,或者明天是该月的最后一天,它会将文件移动到不同的位置。我省略了实际的功能。

变量:

TOM=$(TZ=UTC-24 date +%d)
SUNDAY=$(date +%w)

逻辑如下:

    if [ $TOM -eq 1 ]; then
            move_files monthly
    echo EXEUTING END OF MONTH MOVE AND PURGE, NON-DAILY, NON-END-OF-MONTH

    elif [ $SUNDAY -eq 0 ]; then
            move_files weekly
    echo EXECUTING SUNDAY MOVE AND PURGE, NON-DAILY, NON-END-OF-MONTH

    else echo EXECUTING DAILY MOVE AND PURGE NON-SUNDAY, NON-END-OF-MONTH
            move_files daily
    fi

一切都正常执行,但是昨天(11 月 30 日)它没有正确地将文件移动到目录中monthly,这是该功能的一部分move_files monthly。在其他地方测试,这似乎工作正常。

我运行它的主机是 UTC。

答案1

将上面的一些评论放在一起,使用 GNU 日期,您可以检查明天是否是该月的第一天:

if [[ "$(date -d tomorrow +%d)" == "01" ]]; then
    echo "Tomorrow is the first day of the month"
fi

如果您想知道明天是否是该月的最后一天,您可以类似地执行以下操作:

if [[ "$(date -d "2 days" +%d)" == "01" ]]; then
    echo "Tomorrow is the last day of the month"
fi

答案2

您的问题可能与您的本地时区实际上并非 UTC 有关。使用 GNU 获取偏移时间的最佳方法是将其选项与描述您想要用作参考的日期而不是“现在”的参数一起date使用(如-d安迪的回答)。如果您还想从 GNU 获取 UTC 格式的响应date,请使用它的-u选项。

不使用 GNU date,在bash版本 4.3+ 中:

#!/bin/bash

# Unix timestamp "now"
printf -v now '%(%s)T'    # append "-1" as argument to get it working in bash 4.2

# Today's weekday, 1-7, 1=Monday
printf -v today_day '%(%u)T' "$now"

# Tomorrow's date, 1-31
printf -v tomorrow_date '%(%e)T' "$(( now + 24*60*60 ))"

if [ "$tomorrow_date" -eq 1 ]; then
    echo Today is the last day of the month
elif [ "$today_day" -eq 7 ]; then
    echo Today is Sunday
else
    echo Today is some other day
fi

相关内容