[Linux 셸 스크립트] 사용자 인터페이스 - 009 달력을 이용해 특정 날짜의 로그 파일 삭제하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 사용자 인터페이스 - 009 달력을 이용해 특정 날짜의 로그 파일 삭제하기

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

(1) dialog

(2) awk

(3) rm

 

 

  2. 키워드 & 사용처

(1) 키워드

다이얼로그, 달력, 대화형, 선택

 

(2) 사용처

날짜를 지정하는 대화식 달력을 표시해서 선택하고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ./dialog-calendar.sh

 

 

  4. 스크립트

#!/bin/sh

 

LOG_DIR=/myapp/ap1/log

 

# dialog 명령어로 달력 출력

# 선택한 날짜는 표준 에러 출력이므로 임시 파일에 리다이렉트

dialog --calendar "Select Date" 2 60 2> cal.tmp             

 

# 달력 기능은 일/월/년 형식으로 출력되므로 년월일로 변경

date_str=$(awk -F / '{print $2$2$1}' cal.tmp                 

 

# 취소되면 임시 파일을 삭제하고 종료

if [ -z "date_str" ]; then                     

    rm -f cal.tmp

    exit

fi

 

rm -i ${LOG_DIR}/app_log.$date_str               

 

# 임시 파일 삭제

rm -f cal.tmp

 

 

  5. 해설

이 스크립트는 달력을 표시하고 날짜를 선택받아 그 날짜가 파일명에 있는 로그 파일을 삭제합니다. 이런 경우 dialog 명령어를 서서 다양한 대화형 인터페이스를 가진 셸 스크립트를 작성할 수 있습니다.

 

dialog 명령어의 달력 기능을 쓰려면 다음처럼 작성합니다.

dialog --calender text height width

text : 표시할 문자 메시지
height : 문자 메시지 줄 수
width : 다이얼로그 박스 폭

 

에서 "Select Date" 문자열을 두줄 분략의 높이로표시하고 다이얼로그 박스 폭을 60으로 지정합니다.

 

달력에서 날짜를 선택하는 것은 Tab키로 포커스를 이동해서 Enter키로 선택합니다. Month, Year 컬럼에서는 커서의 위아래로 년월을 선택합니다. 중심에 있는 달력은 커서로 움직이거나 vi 에디터처럼 h, j, k, l키로 이동할 수 있습니다. 한편, 달력 왼쪽 끝에 있는 숫자는 올해 몇 번째 주인가를 나타내는 숫자입니다. 다이얼로그 박스를 취소하고 싶으면 아래에 있는 <Cancel>로 이동해서 Enter키로 선택합니다.

 

dialog 명령어 선택 결과는 표준 에러 출력으로 출력되므로 이 값을 나중에 rm 명령어 인수로 사용하기 위해 임시 파일로 리다이렉트합니다. 에는 표준 에러 출력을 임시 파일 cal.tmp에 출력하기 위해 2> cal.tmp라고 작성합니다.

 

dialog 명령어가 출력하는 날짜를 처리할 때 이 스크립트는 에서 약간의 기교를 사용합니다. 이것은 dialog 명령어의 달력 기능 출력이 다음처럼 일/월/년 순서이기 때문입니다.

15/01/2015

 

이 형식은 서양에서 비교적 자주 씁니다. 이걸 년월일 형식으로 바꾸려면 /를 구분자로 삼등분해서 역순으로 출력하면 됩니다. 에서 awk 명령어 뒤에 옵션 -F /를 써서 /를 구분자로 지정합니다. awk 명령어 안에서는 $1에 15, $2에 01, $3에 2015라는 값이 들어갑니다. 20150115라는 문자열로 바꾸기 위해 $3$2$1 처럼 조합해 역순으로 출력합니다.

 

처럼 다이얼로그에서 취소할 때 아무것도 하지 않고 종료하는 처리입니다. 달력 선택에서 <Cancel>을 누르면 cal.tmp도 비게되므로 셸 변수 date_str값도 빈 문자열이 됩니다. 그러기 위해 test 명령어의 -z 연산자로 빈 문자열인가 판단해서 비었으면 임시 파일 cal.tmp를 rm 명령어로 삭제하고 스크립트를 종료합니다.

 

에서 지정한 날짜의 파일을 삭제합니다. /myappp/ap1/log/app_log.20150115라는 파일을 삭제하게 됩니다. rm 명령어에는 -i 옵션을 붙여서 삭제 전에 확인합니다.

 

이렇게 파일을 삭제하는 스크립트는 생각하지 못한 동작을 해서 다른 파일을 지울 수도 있으니 조심해야 합니다. 파일 삭제 같은 위험한 작업을 포함한 스크립트를 만들 때에는 우선 다음처럼 echo로 문자열을 출력해서 생각대로 동작하는 명령어가 만들어졌는지 확인합니다.

echo rm -i ${LOG_DIR}/app_log.$date_str

 

dialog 명령어에는 아래와 같이 그 외에도 다양한 기능이 있습니다. 자세한 사항은 man dialog로 확인하기 바랍니다.

옵션 설명
--yesno Yes/No를 묻는 다이얼로그 표시
--msgbox [OK]를 표시하는 메시지 박스 표시
--inputbox 값을 입력하는 박스 표시
--fselect 파일 선택 화면 표시
--dselect 디렉터리 선택 화면 표시
--checklist 목록에서 여러 개 체크 가능한 체크 목록 박스 표시
--radiolist 목록에서 하나를 고르는 라디오 버튼 목록 표시
--menu 메뉴 목록 표시

 

예시로 Yes/No를 묻는 다이얼로그 박스(--yesno)를 작성합니다.

#!bin/sh

dialog --yesno "Continue?" 5 40
answer=$?

if [$answer -eq 0 ]; then
    echo "Selected : Yes"
elif [ $answer -eq 1 ]; then
    echo "Selected : No"
fi

 

Yes/No 문의 다이얼로그 박스는 우선 dialog 명령어를 --yesno 옵션으로 시작합니다. 첫 번째 인수가 표시할 텍스트로 보통은 질문을 씁니다. 여기에선 "Continue?"라고 표시합니다. 다음 숫자는 달력과 마찬가지로 다이얼로그 박스 높이와 너비입니다.

 

스크립트에서 Yes와 No 중에 무엇이 눌렸는지 판단하려면 dialog 명령어의 종료 스테이터스를 이용합니다. 명령어 종료 스테이터스는 셸 특수 변수 $?에 저장되는데 dialog 명령어는 Yes를 선택하면 0, No를 선택하면 1이 종료 스테이터스가 됩니다.

 

여기서 이 스크립트는 셸 변수 answer에 $?를 대입하고 이어서 if문에서 Yes일 때(종료 스테이터스가 0)와 No일 때(종료 스테이터스가 1)에 따라 답을 표시합니다.

 

 

<참고사항>

dialog 명령어를 설치하는 방법은 다음와 같습니다.

리눅스(CentOS) 경우 표준 yum 리포지토리에 들어 있으므로 root 권한으로 yum install dialog를 실행하면 설치할 수 있습니다. 설치하면서 의존 패키지도 설치할 것인지 물을 때가 있는데 y를 누르면 포함해서 자동으로 설치합니다.

# yum install dialog

 

리눅스(우분투) 경우 dialog 명령어는 공식 리포지토리에서 제공하므로 apt-get 명령어를 실행하면 설치할 수 있습니다.

$ sudo apt-get install dialog

 

Mac의 경우 소스 코드에서 설치하려면 우선 개발 환경(gcc와 make 설치)을 준비해야 합니다.

dialog 명령어의 소스 코드는 다음 웹 페이지에서 다운로드 가능합니다.

http://invisible-island.net/dialog/dialog.html

 

웹 페이지 왼쪽 메뉴의 Download를 클릭하면 The source (http)라는 소스 코드 링크가 있습니다. 파일 다운로드는 아래와 같이 curl 명령어를 사용합니다.

$ curl -O http://invisible-island.net/datafiles/release/dialog.tar.gz

 

curl 명령어는 기본값이면 내려받은 파일을 표준 출력으로 표시하므로 -O 옵션으로 파일로 저장하기 바랍니다. 그리고 다운로드 한 소스 코드를 tar 명령어로 풀고 configure/make/make install 순서로 컴파일하고 설치합니다.

 

dialog 설치 후엔 --version 옵션으로 명령어를 실행해봅니다.

$ dialog --version
Version : 1.2-20121230

이렇게 버전 정보가 표시되면 dialog 명령어가 제대로 설치된 것입니다. 한편, 명령어를 발견하지 못하면 "command not found" 에러 메시지가 표시되므로 바르게 설치되었는지 확인하거나 환경 변수 PATH에 설치한 디렉터리가 등록되어 있는지 확인합니다.

 

 

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

반응형

댓글