3. OS이야기/03. Shell Script

[UNIX/LINUX] Shell Script 기본 - 1.if문 (4) 예제

알 수 없는 사용자 2014. 4. 22. 13:12

#!/bin/sh

if [ -d $1 ]; then

        cd $1

        ##### Example 1. Test Operator
        if [ -f $2 ]; then
                echo $2' is file.'
                printf $2' is file.'\\n > $1/$2
        else
                echo $2' is not file.'
                touch $1/$2
                printf $2' file is created.'\\n > $1/$2
        fi

        ##### Example 2. Arithmetic Comparison Operator
        if [ $3 -gt 1 ]; then
                echo $3' is greater than 1.'
                printf $3' is greater than 1.'\\n >> $1/$2
        elif [ $3 -eq 1 ]; then
                echo $3' is equal to 1.'
                printf $3' is equal to 1.'\\n >> $1/$2
        else
                echo $3' is less than 1.'
                printf $3' is less than 1.'\\n >> $1/$2
        fi

        ##### Example 3. String Comparison Operator
        if [ $4 == "BMW" -o $5 == "Martiz" ]; then

                if [ $4 == "BMW" ]; then
                        echo $4' is very expensive car.'
                        printf $4' is very expensive car.'\\n >> $1/$2
                fi

                if [ $5 == "Martiz" ]; then
                        echo $5' is twins transformer.'
                        printf $5' is twins transformer.'\\n >> $1/$2
                fi

        else

                echo 'Both '$4' and '$5' are not mine.'
                printf 'Both '$4' and '$5' are not mine.'\\n >> $1/$2

        fi

fi


위와 같이 Shell Script를 작성하니 조금 복잡해 보이긴 하지만 50줄도 안되는 아주 간단한 예제입니다.

 

스크립트에 문단이라는 국어적 표현이 맞을지 모르나, 문단별로 나누어서 설명 드리도록 하겠습니다.

 

먼저 위 예제 스크립트는 외부로부터 변수를 받아 처리하기 위해 스크립트 내부적으로『 위치 매개변수($1, $2, $3, ..) 』를 사용하고 있습니다.

 

그리고 제일 첫 번째 라인은 해당 Shell Script 파일을 어떤 Shell로 처리할 것인지를 선언하는 부분입니다.


#!/bin/sh



다들 아시겠지만 Shell에는 bash, ksh, csh, tcsh 등 여러 종류가 있는데, 해당 OS에서 사용 가능한 Shell 이 어떤 것들이 있는지를 확인해 보고 싶다면 bin 디렉토리로 이동하여 다음과 같은 명령어를 수행시켜 보면 됩니다.


# ls *sh*


또한, 현재 접속한 터미널에서 사용하는 기본 Shell이 무엇인지 확인하려면, 다음의 명령어를 수행합니다.

# echo $SHELL


저의 예제는 ksh 또는 bash Shell 기준으로 만들어졌습니다.

 

이렇게 선언부를 간단히 처리하고 본격적인 Shell Script를 작성하시면 됩니다.

 


1) 첫 번째 문단


if [ -d $1 ]; then                                                   // 첫 번째 매개변수값이 디렉토리라면,

        cd $1                                                           // 해당 디렉토리로 이동

        ##### Example 1. Test Operator              // 주석
        if [ -f $2 ]; then                                           // 두 번째 매개변수값이 파일이라면,
                echo $2' is file.'                                   // '$2 is file.' 이라는 문장을 echo 한다.
                printf $2' is file.'\\n > $1/$2                // '$2 is file.' 이라는 문장을 $1 디렉토리 밑에 $2 파일에 printf 하고 줄바꿈(\n: 개행문자)한다.
        else                                                            // 두 번째 매개변수값이 파일이 아니라면,
                echo $2' is not file.'                            // '$2 is not file.' 이라는 문장을 echo 한다.
                touch $1/$2                                       // $1 디렉토리 밑에 $2 파일을 만든다.
                printf $2' file is created.'\\n > $1/$2  // '$2 file is created.' 라는 문장을 $2 파일에 printf 하고 줄바꿈(\\n) 한다.

        fi


라인별 설명은 위 내용을 참조하시면 되겠고,

 

결국 위 구문을 말로 풀어내자면,

 

첫 번째 매개변수값에 해당하는 디렉토리($1)가 존재하면 change directory하고 output으로 생성할 파일($2)이 있는지 확인한 후(없으면 만들고), 조건식의 true 여부에 따라 각각에 해당하는 문장을 echo 및 printf 하겠다는 것입니다.

 

별로 어렵지 않죠?

 

위 구문 중 touch 명령 라인은 굳이 사용하지 않아도 바로 밑 라인의 '>(redirection)' command 에 의해 자동 파일 생성하게 됩니다.

 

echo나 printf 구문 뒤에는 위와 같이 문자열 등이 올 수 있는데, 문자열은 반드시 '(single quotation) 나 "(double quotation)로 wrap 해 주셔야 하며, 위치 매개변수의 경우엔 quotation 바깥에 명시해 주어야만 실제 매개변수값을 전달받을 수 있습니다.(echo $2' is file.')



2) 두 번째 문단 


        ##### Example 2. Arithmetic Comparison Operator
        if [ $3 -gt 1 ]; then
                echo $3' is greater than 1.'
                printf $3' is greater than 1.'\\n >> $1/$2
        elif [ $3 -eq 1 ]; then
                echo $3' is equal to 1.'
                printf $3' is equal to 1.'\\n >> $1/$2
        else
                echo $3' is less than 1.'
                printf $3' is less than 1.'\\n >> $1/$2

        fi


두 번째 문단에서 주의 깊게 살펴 보셔야할 부분은 elif 구문 뒤에 조건식이 들어간다는 것입니다.(지난 글에서는 언급이 없었네요.;;)

 

elif 구문이 else if 구문과 같으므로 당연히 조건식이 들어가야만 하겠죠.(조건식이 없어도 되는 것은 else 뿐입니다.)

 


3) 세 번째 문단 


        ##### Example 3. String Comparison Operator
        if [ $4 == "BMW" -o $5 == "Martiz" ]; then

                if [ $4 == "BMW" ]; then
                        echo $4' is very expensive car.'
                        printf $4' is very expensive car.'\\n >> $1/$2
                fi

                if [ $5 == "Martiz" ]; then
                        echo $5' is twins transformer.'
                        printf $5' is twins transformer.'\\n >> $1/$2
                fi

        else

                echo 'Both '$4' and '$5' are not mine.'
                printf 'Both '$4' and '$5' are not mine.'\\n >> $1/$2

        fi


세 번째 문단은 문자열 비교 예시로써, 앞서 제가 올린 글들을 잘 읽어 보셨다면 역시 별 무리 없이 이해하실 수 있을 것입니다.

 

위 문단에서 한 가지 언급 드리고 싶은 것은 문자열 비교 시에 대소문자를 구분한다는 것입니다.

 

만일 네 번째 위치 매개변수의 값으로 'bmw' 라는 소문자 문자열이 입력되었다면, 위 문단의 두 번째 조건식($4 == "BMW")에서 false 를 리턴하겠죠.

 

이제 이렇게 작성된 스크립트를 실행시키려면, 사용자가 로그인한 바로 그 계정에서 해당 스크립트에 대한 실행 권한이 있어야 합니다.

 

즉, vi 편집기로 위와 같이 작성 완료한 후에 스크립트 실행 전, 다음과 같이 모드를 변경해 주어야 합니다.


# chmod 755 IfTest.sh

# ls -l IfTest.sh

-rwxr-xr-x       1 root        root           1185  Aug    9  16:52   IfTest.sh


권한이나 모드 변경에 대한 것은 이 글을 읽고 있는 분들께서 사전에 알고 계실 것이라 믿고 설명을 생략하도록 하겠습니다.

 

위와 같이 하였다면 이제 다음과 같이 인자를 주고 실행시킨 후, 결과가 잘 나오는지를 확인하면 됩니다.


./IfTest.sh /opt IfTestResult.txt 0 bmw Martiz



이상으로 if문을 포함하는 Shell Script에 대하여 예시를 통해 한 번 알아보았습니다.