Bash 스크립트

운영체제로그/Linux 2011. 1. 20. 22:33
리눅스를 서버로 자바언어 기반의 웹서비스를 운영하려고 준비하다가,  로그를 
시간, 일일 단위로 수집하여 에러가 발생하면 메일로 전송해주는 기능을 작성해야할 일이 생겼다. 
스프링에서 지원해주는 스케줄링과 메일전송 기능을 사용할 수도 있지만, crontab과 몇 가지 리눅스 유틸리티를
사용해서도 쉽게 해결할 수 있는 일이다. 

일단 스크립트에 익숙지  않기 때문에   Bash 스크립트 구문을  간략히 정리해보고 원하는 기능을 구현해보자

사용자의 디폴트쉘은  /etc/password 파일에 사용자 엔트리에 기반하여 적용이 되며,  대부분 bash(/bin/bash)가 사용된다. 
bash 쉘은 시작시에 /etc/profile 파일을 읽어서 모든 사용자에 쉘환경에 적용을 한다.  사용자 홈디렉토리에 위치하고 있는
.bash_profile, .bash_login, .profile 파일은 현재 쉘환경만 적용이 된다. 쉘이 닫힐 때는 ~/.bash_logout 파일이  실행이 된다. 

1 스크립트 실행 
스크립트를 실행하기 위해서는, 파일에 실행권한을 부여해야 한다. 
$chmod u+x myscript.sh
bash 명령을 주어 명시적으로 실행하려면,  스크립트 파일의 가장 첫라인은 다음과 같이 시작해야 한다. 
#!/bin/bash

2 변수선언과 테스트문 
테스트문은 참과 거짓을 판별하는 표현식으로 대괄호[] 안에 표시를 한다.  변수를 선언하고 테스트문을 사용하는 예이다. 
MYSTRING=abc if [ $MYSTRING = abc ] ; thenecho “The variable is abc” if
위 예에서는 MYSTRING 이라는 변수를 선언하고 그 값이 "abc" 와 같은면 메시지를 출력하고 있다. 
다음은 테스트문에서 수를 비교하는 예이다. 
MYNUMBER=1 
if [ $MYNUMBER -eq 1 ] ; then
    echo “MYNUMBER equals 1”; 
fi 

if [ $MYNUMBER -lt 2 ] ; then 
    echo “MYNUMBER <2”; 
fi 

if [ $MYNUMBER -le 1 ] ; then 
    echo “MYNUMBER <=1”;
 fi 

if [ $MYNUMBER -gt 0 ] ; then 
    echo “MYNUMBER >0”; 
fi 

if [ $MYNUMBER -ge 1 ] ; then 
    echo “MYNUMBER >=1”; 
fi

각각 MYNUMBER 변수에 있는 값을 비교하여 메시지를 출력하고 있다. 테스문에서 사용한 기호는 각각 =, <, <=, >, >= 를 의미한다. 다음은 파일에 대한 테스문 예이다.
filename=”$HOME” 
if [ -e $filename ] ; then 
    echo “$filename exists”; 
fi

if [ -f “$filename” ] ; then
    echo “$filename is a regular file” 
elif [ -d “$filename” ] ; then	
    echo “$filename is a directory” 
else	
    echo “I have no idea what $filename is”
fi
위에서 사용한 테스트문 연산자에 대해서 알아보자 .

                      연산자   의미  연산자  의미
 -e(a) file 파일이 존재하는지 검사   expr1 -a expr2 and 
 -d file  파일이 디렉토리인지 검사  expr1 -o expr2  or
 -f file  파일이 일반파일인지 검사  file1 -nt file2  modification time is newer than
 -L(f) file 파일이 심볼릭 링크인지 검사   file1 -ot file2  modification time older than
 -n string 문자열길이가 0보다 큰지검사   file1 -ef file2 두 파일이 링크로 연결유무 
 -z string 문자열길이가 0인지 검사   var1 -ne(!=) var2  not equal
 -o file 파일을 소유하고 있는지검사   var1 -eq(=) var2  equal
 -r file 파일을 읽을 수 있는지 검사   var1 -ge var2  equal or greater than
 -w file  파일을 쓸 수 있는지 검사  var1 -gt var2  greater than
 - x file  파일을 쓸 수 있는지 검사  var1 -le var2 less than or equal 
 -s file  파일이 존재하고, 
0바이트보다 큰지 검사
var1 -lt var2   less than
   
 


3 case 문 (c언어의 switch 문)
case “$VAR” in	 
string1)		
    { action1 };; 
string2)		
    { action2 };;	
*)		
    { default action } ;; 
esac


4 for 문
for NUMBER in 0 1 2 3 4 5 6 7 8 9 do	echo The number is $NUMBER done
아래와 같이 backtick(`)으로 감싸 ls 명령을 수행한 결과에 대해서 반복을 할수도 있다. 
for FILE in `/bin/ls`; do
     echo $FILE; 
done


5 while문
변수를 카운트하여 루프를 도는 예이다. 
VAR=0 
while [ $VAR -lt 3 ]; do
    echo $VARVAR=$[$VAR+1]
Done


6 until 문
until 구문을 사용하여,  while 문과 동일한기능을 수행할 수 있다. 
VAR=0 until [ $VAR -eq 3 ]; do echo $VAR; VAR=$[$VAR+1]; done