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

monthly모든 것이 잘 실행되고 있었지만 어제(11월 30일) 기능의 일부인 디렉토리로 파일을 올바르게 이동하지 못했습니다 move_files monthly. 다른 곳에서 테스트했는데 정상적으로 작동하는 것 같습니다.

내가 실행 중인 호스트는 UTC입니다.

답변1

위의 설명 중 일부를 종합하면 GNU 날짜를 사용하여 내일이 해당 월의 1일인지 확인할 수 있습니다.

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버전 bash4.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

관련 정보