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 지정'을 의미합니다. 이렇게 하면 다음날을 지정할 수 있습니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 날짜 처리 - 054 윤년인지 확인하기 (0) | 2021.03.29 |
---|---|
[Linux 셸 스크립트] 날짜 처리 - 053 한 달 전에 만든 로그 파일을 일괄 아카이브 하기 (0) | 2021.03.29 |
[Linux 셸 스크립트] 날짜 처리 - 051 date 명령어로 두 날짜를 비교하고 날짜차를 구하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 050 sed로 파일 치환 심볼릭 링크를 실제 파일로 바꾸지 않게 하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 049 이중 실행이 가능한 임시 파일 작성하기 (0) | 2021.03.26 |
댓글