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

  • 마치며..

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

  • 댓글 없음:

    댓글 쓰기