쉘프로그래밍

Mokwon Univ 2008. 8. 16. 15:35
쉘 프로그래밍 (shell programming) 이란


unix 시스템의 사용자는 여러 개의 쉘 명령어들을 똑같은 순서로 반복해야 하는 경우가 있을 수 있다. 이런 경우 명령어들을 파일로 저장해두고 쉘 명령어처럼 사용할 수가 있는데, 이런 파일들을 쉘 script 또는 쉘 program 이라 한다.

쉘이 쉘 program을 실행하기 위하여는 program 파일을 읽고 각 줄을 실행할 수
있어야 한다. 그래서, 해당 쉘 program 파일에 대해 read(읽기)와 execute(실행하기)권한이 주어져야 한다.

쉘 스크립트의 문법은 쉘의 종류에 따라 다소의 차이가 있으며, 유닉스시스템에서 초기 구동시 참고하는 파일들이 대부분 bourne 쉘 문법으로 되어있기에 여기서는 bourne 쉘 문법을 중심으로 전개하려 한다.

자, 그럼 sample program을 만들어 보자.
    $ cat sample_pgm
    # this is sample program
    who am i
    ls -f
    $ chmod +x sample_pgm
    $ sample_pgm

위의 sample 예제는 login name을 알아보고 현재 디렉토리의 파일 목록을 출력하는 program이다. 5번째 줄에서 실행 가능하도록 execute 권한을 부여하였다.
 
 

쉘 script의 인수(argument)


파일을 복사해 주는 cp 명령어를 생각해보면 cp 명령어 다음에 복사할 파일명과 복사될 파일명을 입력해야 한다. 이처럼 대부분의 명령어들이 인수를 허용하는데, 쉘 script에도 인수 이용이 가능하다.


사용법을 살펴보면, 쉘 프로그램 이름  arg1 arg2 … argn
쉘 프로그램 내에서 각 인수는 $0 (program 이름), $1(arg 1), $2(arg 2)…$n(arg n)으로 참조된다.

사용예는 다음과 같다.
    $ cat sample_2
    echo your program name : $0
    echo first argument : $1
    echo second argument : $2
    $ chmod +x sample_2
    $ sample_2 love dream
    your program name : sample 2
    first argument : love
    second argument : dream

쉘 변수 할당하기

쉘 script는 쉘 변수라는 기능을 사용하여, 보다 더 유연하게 작성될 수 있다.
쉘 변수는 문자열을 저장하는데 사용하는 하나의 이름이다. 변수 값은 문자열이 된다. 변수 이름 다음에 등호(=)와 변수 값을 기입함으로서 변수에 값을 줄 수 있다. 예를 들어 bin이란 변수에 "bin"이란 값을 주려면,
   
    $ bin=bin
    $ export bin

두번째 줄은 bin을 지역변수에서 전역변수로 바꿔주는 명령어이다.
쉘 명령에서 변수의 값을 참조하려면 변수명 앞에 $를 붙여 사용한다.
예를 들어,
    $ cd/usr/$bin
    $ pwd
    /usr/bin

cd 명령을 실행하기 앞서 쉘은 bin이라는 변수 이름 대신 변수의 값 "bin"으로 대체한다.결국, $cd/usr/bin 이라 입력한 것과 같다.
 

exit명령어와 return명령어

exit 명령어
쉘 program을 종료하고 반환 code를 설정한다. 사용법은.
    exit [arg]

return 명령어
함수의 실행을 정지하고 호출 프로시저로 돌아간다. 사용법은,
    return [arg]

호출 프로시저가 없을 경우 return 명령어는 exit와 같다.
 
 
return codes


unix의 모든 명령은 명령이 완료될 때 반환 code를 생성한다. 명령이 정상적으로 종료되었으면 0을 return시키고 오류가 났으면 0이 아닌 값을 반환한다. 리턴코드는 쉘 변수인 $?로 참조할 수 있다.


상용법을 살펴보면,
    $ ls    
    $ echo $?
     0

쉘 변수$?은 최종적으로 return된 값을 참조한다.

    $ true
    $ echo $?
     0

true명령은 항상 0을 되돌려 준다.

    $ false
    $ echo $?
     1

false명령은 항상 1을 반환한다.

    $ cp
    $ echo $?
     1

인수가 빠져 있기에 오류가 발생함.

test 명령어


test 명령어
test 명령어는 표현식을 평가하고 반환code를 생성하는데 사용한다. test 명령어는 정수와 문자열과 파일의 조건을 검사하는 데에 사용될 수 있으며, 일반적으로 if문과 while문 등의 조건부 흐름 제어에 사용한다.
사용법은,
    test expression or [expression]
표현식이 true이면 0을 return하고 false이면 0이 아닌 값을 return한다.

수식 평가
수식을 평가하는 데에의 표현식 사용법은,
     [숫자 관계 숫자]

여기서 관계는,
    -lt : less than
    -le : less than or equal to
    -gt : greater than
    -ge : greater than or equal to
    -eq : equal to
    -ne : not equal to

예를 들어 x를 3이라 가정하면,
    $ [ $x -lt 7]
    $ echo $?
    0
    $ [ $x -gt 7]
    $ echo $?
    1


문자열 평가
test 명령에서 문자열을 평가할 때의 표현식은,
    [문자열1 = 문자열2] : 문자열이 같은 지를 평가함.
    [문자열1 != 문자열2] : 문자열이 다른 지를 평가함.

예를 들어보자.
    $ x=abc
    $ [ $x ="abc"]
    $ echo $?
    0
    $ [ $x !="abc"]
    $ echo $?
    1

문자열에는 반드시 ""나''부호를 사용해야 한다.
문자열 연산자에는,
    -z 문자열 : 문자열의 길이가 0이면 참
    -n 문자열 : 문자열의 길이가 0이 아니면 참


파일 평가
test 문에서 파일이 디렉토리인지 파일인지를 평가할 수 있다.
사용법은,
    test -Option filename
    여기서 Option은,
    -f : filename이 파일이면 참.
    -d : filename이 디렉토리이면 참.
    -s : 파일이 존재하며 크기가 0보다 크면 참.
    -r : 파일이 존재하며 읽기 가능하면 참.
    -w : 파일이 존재하며 쓰기 가능하면 참.
    -x : 파일이 존재하며 실행 가능하면 참.


다른 연산자
test 명령어에서 다음의 연산자를 사용하면 복수 검사가 가능하다.
              
    -o : or
    -a : and
     ! : not
    \(\) : grouping

예를 들어,
    $ test -s filename -a -r filename

파일이 존재하고 size가 0보다 크며 그리고(and) 읽기 가능한지를 검사함.
 

산술식 표현


본격적으로 반복문을 시작하기 전에, 쉘 script에서의 산술식 표현 방법을 알아보자. 산술식 표현 방법은,
 
    let expression or ((expression))

예를 들어보자.
    $ x=10
    $ y=2
    $ ((x=x+2))
    $ echo $x
    12


쉘 script에서의 산술식은 let 명령을 사용하거나, 괄호를 두 개 사용하여 표현하거나 expr 명령어를 이용한다. 예를 들어보자.

    $ let x=x+6
    $ echo $x
    18
    $ let "x=x/(y+1)"
    $ echo $x
    6

산술식 표현 속에 괄호는 평가 순서를 바꾸는 데 사용될 수 있다. 이런 경우 큰 따옴표를 써야함을 유의하자. 위의 형식에 대한 바른 표현은,

    let "x=x/(y+1)"또는 ((x=x/(y+1))) 또는 x=`expr $x/($y+1)`
[참고] ` (back qoute) expr 을 사용한 예를 더 살펴보자.
    $ expr 30 "*" 30
   900

if 문


if 문은 program을 조건에 따라 분기시킨다.사용법을 살펴보면,
    if
     list a
    then
     list b
    fi



사용예는 다음과 같다.
    if
     test -s funfile
    then
     echo funfile exists
    fi

funfile이 존재하고 크기가 0이 아니면 "funfile exists"라는 message를 화면에 뿌린다.
 

반복문 (loop문)


반복문은 일련의 명령을 반복할 수 있게 한다. 반복을 계속할 지는 키 명령의 반환 코드에 기초하여 이루어진다.if 문이나 case 문은 key word로 시작되고 거꾸로 된 key word로 끝나는 반면 반복문은 키워드와 어떤 조건으로 시작하고 내부는 do/done으로 둘러 쌓이게 된다.

반복문은 아래의 3가지 형태이다.
   
while 문
    while…
      do
    done
 
until 문
    until…
      do
    done

for 문
    for…
      do
    done
 

while 문


while 문은 조건이 참인 동안은 loop를 반복한다.
사용법을 살펴보면,
    while
     list a
    do
     list b
    done



사용예[1]은 다음과 같다
    $cat sample_while
    x=1
    while((x<=10))
    do
     echo x is $x
     let x=x+1
    done
    $sample_while
     x is 1
     x is 2
     x is 10

위의 예에서 알 수 있듯이 조건식인 ((x<=10))이 참인 동안은 loop 내부를 반복하게 된다. 그래서, 무한 loop에 빠지지 않아야 함을 주의하자.


사용예[2]는 다음과 같다
    $ cat sample_while2
     ans=yes
     while
      [ $ans = "yes" ]
     do
     echo enter a name
     read name
     echo yes or no
     read ans
    done
    $ chmod 777 sample_while2
    $ sample_while2

until 문


until 문은 조건식이 참이 될 때까지 loop를 반복한다.(비교 : while 문은 조건이 참인 동안 loop가 계속된다.)


사용법을 살펴보면,
    until
     list a
    do
     list b
    done



사용예는 다음과 같다.
    $ cat sample_until
      x=1
      until((x>10))
     do
      echo x is $x
      let x=x+1
     done
    $ sample_until
      x is 1
      x is 2
        x is 10

위의 예에서 알 수 있듯이 until 문은 조건이 참이 될 때 까지 반복된다.
 

for 문

for 문은 list에 있는 각 item들이 for 반복문에 순차적으로 할당되어 소진될 때 까지 oop를 실행한다.
사용법을 살펴보면,
    for var list
    do
     list
    done



사용예는 다음과 같다.
    $ cat sample_for
     for x in 1 2 3 4 5
     do
      echo " 2 * $x is \c"
      let x=x=+2
     echo $x
     done
    $ sample_for
      2*1 is 2
      2*2 is 4
        2*5 is 10

break, continue, exit


반복문에서 loop를 중단시킬 필요가 있을 때가 있을 수 있다. break 와 continue 는 무조건적인 흐름 제어를 제공한다.

exit

전체 프로그램이 종료되어야 할 경우 사용한다.
프로그램을 완전히 종료하고 쉘 프롬프트로 나가게 한다.

break
loop 를 종료하고 done 다음의 명령을 계속하여 수행하도록 한다.

continue
loop 의 나머지 명령을 중단하고 loop 의 맨 위로 가게 한다.
즉, continue는 단지 한번의 loop를 종료하고 loop의 맨 위에서 loop를 계속하게하며, break는 loop를 빠져나가 다음 단계를 계속 수행하게 한다.


사용예는 다음과 같다.
    $ cat sample_break
     while
      true
     do
      echo "enter file name to remove :\c"
      read file
      if test ! -f $file
      then
       cho $file is not a require file
       continue
      fi
      echo removing $ file
      rm $file
      break
     done
Posted by 용학도리
,