2007년 7월 26일 목요일

[scrap] 리눅스 쉘 - 쉘 프로그래밍

출처 : 코리아인터넷닷컴, a 2003년 05월 22일
저자 : 정원석


리눅스 쉘 II
(1) : 쉘 프로그래밍이란?
  • 시작하며

    리눅스의 명령어를 보면 Windows나 예전의 Dos보다 사용법도 까다롭고 명령어도 많아 유용한 기능들을 제대로 활용하기가 어렵다. 그래서 이번에는 쉘 프로그래밍을 배우면서 리눅스의 다양한 기능들을 배워보자.

  • 쉘 프로그래밍이란?

    쉘 프로그래밍은 다른 언어의 프로그래밍보다 어렵지 않다. 예전의 Dos에서 Autoexec.bat 같은 Batch 파일 작성하는 것과 비슷하게 생각하시면 된다. 순차적으로 실행되는 방식이라 프로그래밍이 그리 어렵지 않고 베이직과 같은 Interpreter방식이라 결과값도 빨리 볼 수 있고 디버깅도 쉽다. 그리고 무엇보다 리눅스의 기능들을 다양하게 활용할 수 있다.

    * Interpreter는 고급언어로 작성된 원시코드 명령문들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이다.

  • 쉘 프로그래밍의 기본 문법

    쉘 프로그램을 작성하는 방법은 두 가지가 있다. 첫번째는 명령을 차례대로 입력하고 쉘이 실행하게 해주는 것이고, 두번째는 프로그램으로 호출할 수 있는 스크립트 파일에 명령을 저장하여 실행하는 것이다. 쉘 프로그램도 프로그래밍 언어이기 때문에 기본 문법을 익혀두어야 한다.

  • 리눅스 쉘 II (2) : 변수 및 조건문

    1. 변수

    변수명=값

    위와 같이 변수의 값을 설정할 때에는 변수명 다음에 '=' 을 사용하여 값을 넣어주면 된다. 한 가지 주의할 점은 '=' 좌우에 공간이 있으면 안된다. 숫자형, 문자형 변수의 구별은 따로 하지 않으며 ""를 사용하면 문자열 변수 로 사용할 수 있다.

    string="Powerful Linux, Easy Linux"

    값이 설정된 변수를 사용할 때는 변수명 앞에 '$'자를 붙여서 쓰면 된다.

    $변수명

    2. 조건문

    ① 문법

    조건문은 어떤 조건을 테스트하고 이런 결졍에 따라 동작을 수행하는 것이다. 쉘 스크립트에서 사용되는 조건문의 구조를 살펴보고 저어구조에 대해서 살펴보자.

    test expressions
    [ expressions ]

    각 expression 사이나 [ 뒤와, ] 앞에는 꼭 공간을 넣어야만 한다.

    ② 수치 조건문

    숫자를 비교하는 조건문이다.

    [ $A -eq $B ] : A와 B의 값이 같은 경우

    [ $A -ne $B ] : A와 B의 값이 다른 경우

    [ $A -gt $B ] : A가 B보다 큰 경우

    [ $A -lt $B ] : A가 B보다 작은 경우

    [ $A -ge $B ] : A가 B보다 크거나 같은 경우

    [ $A -le $B ] : A가 B보다 작거나 같은 경우

    ③ 파일 조건문

    파일의 존재 유무와 읽기 쓰기 가능 여부를 테스트하기 위한 조건문이다.

    [ -s filename ] : file이 존재하면서 크기가 0보다 큰 경우

    [ -f filename ] : directory가 아닌 file인 경우

    [ -d directoryname ] : file이 아닌 directory인 경우

    [ -w filename ] : 쓰기가 가능한 경우

    [ -r filename ] : 읽기가 가능한 경우

    [ ! -option filename ] : option의 조건이 거짓이 되는 경우

    ④ 문자열 조건문

    문자열 검사로서 문자열을 비교할 때는 꼭 ""를 사용하여야 한다.

    [ "string1" = "string2" ] : 두 문자열이 같은 경우

    [ "string1" != "string2" ] : 두 문자열이 다른 경우

    [ -z "string" ] : 문자열의 길이가 0인 경우

    [ -n "string" ] : 문자열의 길이가 0이 아닌 경우


    리눅스 쉘 II (3) : 흐름 제어 - 1

    3. 흐름 제어 - 1

    ① if / elif / else

    문법

    if condition
    then
    statements
    elif condition
    then
    statements
    else
    statements
    fi

    * if의 개수만큼 fi를 사용해야 한다.

    ex)

    설명: 만약 wacky라는 file이 존재한다면 그 이름을 merong로 바꾸고 wacky가 존재하지 않고 haha라는 파일이 존재하면 haha를 huhu로 바꾼다.

    if [-f wacky]
    then
    cp wacky merong
    elif [-f haha]
    then
    mv haha huhu
    else
    echo "흠흠...예제"
    fi

    if 문을 사용할 때는 주의할 점이 몇가지가 있다. if문을 쓸때는 then과 fi를 항상 같이 써야 하고, 쉘에서 스크립트를 분석할 때는 줄 단위로 하기 때문에 if,then,fi를 다른 줄에 써야 한다. 그리고 then 다음에 아무런 내용이 없으면 오류가 발생한다. 그래서 ':'(true command)를 then 뒤에 붙이던가 아니면 else문을 쓰지 않아야 한다.

    ② for

    in 뒤의 리스트들을 for 다음에 나오는 변수의 값으로 하나씩 대치시켜 사용한다.

    문법

    for 변수 in list1 list2 list3 ...
    do
    statements
    done

    * list은 공간으로만 구별한다.

    ex)

    설명: list값이 하나씩 ha로 들어가 화면에 출력된다.

    for ha in wacky haha merong
    do
    echo $ha
    done

    ③ While

    조건이 만족하는 한 do done 사이의 statments를 반복하여 실행한다.

    문법

    while condition
    do
    statements
    done

    * 조건문이 항상 True거나 0보다 크게 되면 무한 루프가 되버린다.

    ex)

    설명: ha의 값을 20이 될 때까지 반복하여 찍는다.

    ha=1
    while [ "$ha" -le 20 ]
    do
    echo $ha
    ha=$(($ha+1))
    done

    ④ Until

    while 과는 반대로 조건문이 True이면 루프를 끝낸다.

    문법

    until condition 
    do
    statements
    done

    ex)

    until who | grep "wacky"
    do
    sleep 10
    done

    리눅스 쉘 II (4) : 흐름 제어 - 2

    3. 흐름 제어 - 2

    ⑤ continue and break 문

    continue와 break문은 다른 언어에서와 비슷하게 사용한다. 둘다 루프문 안에서 사용되고 continue는 루프문 중간에 continue이하를 실행하지 않고 다시 조건 검사를 하는 것이고, break문은 루프문을 강제로 빠져나올때 사용한다.

    ex)

    while :
    do
    read x
    if [ "$x" = "yes" ]
    then
    continue
    else
    break
    fi
    done

    ⑥ case 문

    case문은 변수 값에 따라서 선택 작업을 할 때 사용한다.

    문법

    case variable in
    pattern1 [| pattern2 ] ... ) statements ;;
    easc

    ex)

    read temp
    case "$temp" in
    x|X)
    echo "Exit"
    exit;;
    list)
    ls -a;;
    easc

    ⑦ Redirection

    Redirection은 표준입력과 표준출력의 방향을 결정해주는 역활을 한다.

    문법

    > file 또는 1 > file : file로 내용을 출력한다.

    >> file 또는 1 >> file : file에 내용을 덧붙인다.

    < file : file로 부터 내용을 읽어들인다.

    2> file : file로 error 내용을 출력.

    | : '|' 왼쪽의 출력 내용을 '|'오늘쪽의 입력으로 사용한다.

    ex)

    cp temp tmp 2> errorfile
    if [ -s errorfile ]
    then
    echo "Error"
    fi

    리눅스 쉘 II (5) : 함수 만들기

    4. 함수 만들기

    C 언어와 비슷한 형태의 함수를 Shell Script안에 선언하여 사용할 수 있다.

    문법

    function()
    {
    statements
    }

    ex)

    설명: 여러곳의 taget으로 file을 복사하는 함수

    multicopy()
    {
    source=$1
    while[ $# -gt 1 ]
    do
    cp $source $2
    shift
    done
    }
    multicopy temp temp1 temp2 temp3

  • 마치며..

    앞으로 리눅스를 사용하면서 간단한 반복작업을 하는 프로그램을 짜야 하는 경우가 있을것이다. 쉘 프로그래밍은 문법이 다른 언어에 비해 그리 어렵지 않아 배우기가 쉽기 때문에 사용할 줄 안다면 리눅스에서 매우 편하게 작업할 수 있을것이다.

  • 댓글 없음:

    댓글 쓰기