사용자 인터페이스_09 달력을 이용해 특정 날짜의 로그 파일 삭제하기

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

명령어: dialog, awk, rm
키워드: 다이얼로그, 달력, 대화형, 선택
사용처: 날짜를 지정하는 대화식 달력을 표시해서 선택하고 싶을 때


실행예제

$ ./dialog-calendar.sh

스크립트

#!/bin/sh

LOG_DIR=/myapp/ap1/log

# dialog 명령어로 달력 출력
# 선택한 날짜는 표준 에러 출력이므로 임시 파일에 리다이렉트
dialog --calendar "Select Date" 2 60 2>cal.tmp  #--------------- 1

# 달력 기능은 일/월/년 형식으로 출력되므로
# 년월일로 바꿈
date_str=$(awk -F / '{print $3$2$1}' cal.tmp)  #---------------- 2

# 취소되면 임시 파일을 삭제하고 종료
if [ -z "$date_str" ]; then  #---------------------------------- 3(if문)
  rm -f cal.tmp
  exit
fi

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

# 임시 파일 삭제
rm -f cal.tmp

   

해설

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

  • dialog-calendar.sh 실행화면


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

  • 이스케이프 시퀀스 작성법

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

1에서 “Select Date” 문자열을 두줄 분량의 높이로 표시하고 다이얼로그 박스 폭을 60으로 지정합니다.   달력에서 날짜를 선택하는 것은 Tab 으로로 포커스를 이동해서 Enter키로 선택합니다. Month, Year 컬럼에서는 커서의 위아래로 년월을 선택합니다. 중심에 있는 달력은 커서로 움직이거나 vi 에디터처럼 h, j, k, l키로 이동할 수 있습니다. 한편, 달력 왼쪽 끝에 있는 숫자는 올해 몇 번째 주인가를 나타내는 숫자입니다. 다이얼로그 박스를 취소하고 싶으면 아래에 있는 , 컬럼에 `tab`으로 이동해서 을 `Enter`로 선택합니다.

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

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

15/01/2015

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

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

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

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

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

dialog 명령어의 다른 기능

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

  • dialog 명령어 주요 옵션

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

Yes/No를 묻는 다이얼로그 박스(–yesno)를 써봅시다.

  • 파일1 다이얼로그 박스 예제

    #!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)에 따라 답을 표시합니다.