날짜처리_02 오늘이 말일인지 판별하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: date
키워드: 월말
사용처: 오늘이 달의 마지막 날인지 스크립트에서 판정하고 싶을 때


실행예제

$ ./monthday.sh     월별 리포트 작성하는 외부 스크립트 실행

스크립트

#!/bin/sh

tomorrow=$(date "+%d" -d '1 day')  # ------ 1 

if [ "$tomorrow" = "01" ]; then  # -------- 2
    # 오늘이 말일이라면 월별 리포트를 작성하는 외부 스크립트 실행
    ./monthly_report.sh
fi

   

해설

이 스크립트는 현재 날짜를 판단해서 말일이면 월별 리포트를 집계하는 monthly_report.sh라는 외부 스크립트를 실행합니다. 집계 처리나 마감 처리 같이 그달의 말일만 실행하는 프로그램이나 배치 처리가 많습니다. 하지만 정기적으로 실행하기 위한 cron은 월초를 1일로 삼아 실행하도록 설정하면 되지만 월말은 딱히 한 날을 지정할 수 없습니다. 따라서 다음과 같은 방법을 자주 사용합니다.

  • cron으로 매일 실행하도록 설정
  • 스크립트에서 오늘이 말인인지 판단해서 말일일 때만 처리

이렇게 ‘오늘이 말일인가’ 판정하는 처리를 자주 사용합니다.

1월이면 31일, 2월이면 28일(윤년이면 29일)처럼 그달의 말인은 년과 월에 따라 달라져 엄격히 따지자면 판별하기가 꽤 복잡합니다. 그런데 ‘내일이 1일이면 오늘은 말일’처럼 계산하면 간단합니다.

1에서 date 명령어로 셸 변수 tomorrow에 다음날 날짜를 저장합니다. “+%d”를 사용하여 date 명령어 출력 형식으로 ‘일’만 출력하도록 지정합니다.

그리고 -d 옵션에 ‘1 day’를 붙여 다음날을 지정합니다. date 명령어는 -d 옵션을 써서 현재 시각의 전후를 지정할 수 있습니다. 예를 들어 3일 전을 알고 싶으면 ‘3 days ago’를 지정합니다.

date "+%d" -d '3 days ago'

-d 옵션은 리눅스 전용입니다.

2에서 셸 변수 tomorrow에 대입한 내일 날짜가 문자열 “01”과 같은지 if문으로 판정합니다. 만약 값이 “01”이라면 오늘이 월말이 됩니다. 따라서 if문에서 월말 처리가 가능합니다.

   

주의사항

  • FreeBSD나 Mac 같은 BSD 계열 유닉스의 date 명령어에는 -d 옵션이 없으므로 다음과 같이 -v 옵션을 사용합니다.
    tomorrow=$(date -v+1d "+%d")
    

    -v+1d는 ‘-v 옵션에 +1d 지정’을 의미합니다. 이렇게 하면 다음날을 지정할 수 있습니다.