[Linux 셸 스크립트] 날짜 처리 - 052 오늘이 말일인지 판별하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 날짜 처리 - 052 오늘이 말일인지 판별하기

by 찬찬이 아빠 2021. 3. 26.
반응형
  1. 사용 명령어

(1) date

 

  2. 키워드 & 사용처

(1) 키워드

월말

 

(2) 사용처

오늘이 달의 마지막 날인지 스크립트에서 판정하고 싶을 때 사용합니다.

 

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

 

 

  4. 스크립트

#!/bin/sh

 

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

 

if [ "$tomorrow" = "01" ]; then                   

    # 오늘이 말일이라면 월별 리포트를 작성하는 외부 스크립트 실행

    ./monthly_report.sh

fi

 

 

  5. 해설

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

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

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

 

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

 

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

 

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

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

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

 

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

 

 

<주의사항>

FreeBSD나 Mac 같은 BSD 계열 유닉스의 date 명령어에는 -d 옵션이 없으므로 다음과 같이 -v 옵션을 사용합니다.

tomorrow=$(date -v+1d "+%d")

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

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글