매일 실행되는 스크립트가 있습니다. 오늘이 무슨 요일인지, 내일이 월의 마지막 날인지에 따라 파일이 다른 위치로 이동됩니다. 실제 기능은 생략했습니다.
변하기 쉬운:
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
버전 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