더북(TheBook)

결과를 확인해보자. syslogresult에는 5줄의 결과만 저장되긴 하는데 문제가 생겼다. 인자를 넣지 않고 sysloger를 실행하면 tail 명령의 옵션 -n 다음 값이 존재하지 않기 때문에 오류가 발생한다.

shinjaehun@losttemple:~$ ./sysloger 5

문제를 해결하기 위해 변수를 하나 추가(line)하자. 여기서 문자열 대체 연산자가 등장했다. ${변수:-기본값}은 해당 변수가 존재하지 않으면 변수에 기본값을 저장한다. 인자를 넣지 않고 sysloger를 실행하면 $1이 존재하지 않기 때문에 line에 기본값 10이 저장된다. ./sysloger 2라고 입력한다면 $1에는 2가 저장되고 line에는 2가 저장된다.

#!/bin/bash
result=syslogresult
line=${1:-10}

tail /var/log/syslog -n$1ine > $result

각각 테스트하고 테스트마다 syslogresult의 결과도 확인해보았다.

shinjaehun@losttemple:~$ ./sysloger
shinjaehun@losttemple:~$ ./sysloger 2

좀 더 세련되게 날짜에 따라 sysloger 스크립트 결과를 다르게 저장해볼까? ‘`’(키보드 배열에서 왼쪽 위 ‘~’와 함께 있는 문자)는 명령을 실행하고 결과를 반환한다. date +%y%m%d는 날짜를 ‘연월일’ 형식으로 출력하는 명령으로 오늘 날짜를 반환할 것이다. 따라서 result에는 ‘syslogresult년월일’ 파일 이름이 저장될 것이다.

#!/bin/bash
result=syslogresult`date +%y%m%d`
line=${1:-10}

tail /var/log/syslog -n$1ine > $result

sysloger 스크립트를 실행한 결과는 다음과 같다.

shinjaehun@losttemple:~$ ./sysloger
shinjaehun@losttemple:~$ ls
syslogresult141020

변수뿐만 아니라 흐름 제어도 사용 가능하다. 다른 프로그래밍 언어들처럼 if 조건문을 사용할 수 있다. 다소 멍청한 의도지만 tail 결과를 30줄 이상 출력하지 못하도록 제한해 보았다.

인자 없이 명령을 실행하면 출력할 행은 10줄로 지정되어 변수 line에 저장된다. [] 안에 조건을 입력하는 데 양쪽에 공백이 있어야 하므로 주의해야 한다. [ $1 -gt 30 ]line에 저장된 값을 산술비교하여 30보다 크면(greater than, gt) ‘참’이므로 then 이하를 실행한다. echo 명령으로 “too big”이라는 문자열을 화면에 출력하고 exit 명령으로 스크립트를 중단한다. 30보다 크지 않으면 else 이하를 실행하여 정상적으로 tail 명령을 처리한다.

#!/bin/bash
result=syslogresult`result +%y%m%d`

line=${1:-10}

if [ $line -gt 30 ]
then
  echo "too big"
  exit 1
else
  tail /var/log/syslog -n$1ine > $result
fi

40줄을 입력하면 “too big”이라는 매정한 메시지를 출력하고 스크립트는 종료된다.

shinjaehun@losttemple:~$ ./sysloger 40
too big

마지막으로 sysloger를 아무 곳에서나 실행할 수 있도록 /usr/local/bin으로 옮겼다. 끝!

shinjaehun@losttemple:~$ sudo cp sysloger /usr/local/bin/
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.