본문 바로가기

UNIX

LINUX GETOPTS v1.0

LINUX GETOPTS v1.0

 

Date

Ver

Etc.

2011.04.20

v1.0

 

 

 

 

 

 

 

 

 

1.     GETOPTS

LINUX 명령을 사용하면 각 명령에 대해 option 을 지정할 수 있다. 이를테면 ls -l, echo -n “” 와 같이 -{argument} 라는 형태로 사용을 한다.

 

위와 같은 기능을 bash shell 에서는 GETOPTS 를 통해 지원하고 있다.

 

2.     USAGE

 

while getopts ":l:ADVH" opt;

do

        case $opt in

        l) echo

                export g_opt=$OPTARG;;

        A) echo 'A option'

                export sort='A';;

        D) echo 'D option'

                export sort='D';;

        V) echo 'V option'

                export print='V';;

        H) echo 'H option'

                export print='H';;

        \?) echo 'usage : commnad [-l] [ -A | -D ] [ -V | -H ] args...'

        exit 1

        esac

done

 

while 문에 getopts 를 사용한다.

getopts 뒤에는 arguments 로 어떤 문자를 지정할 것인지 그 항목을 나열한다.

 

위의 경우에는 ":l:ADVH" 와 같이 사용했는데 이것의 의미는 l 옵션은 추가 인자가 필요하며 나머지 A, D, V, 그리고 H 인자에 대해서는 추가 인자가 필요하지 않다는 의미이다. l 옵션의 경우 ‘:’ 로 싸여있는데 이것이 추가 인자가 필요하지 않다는 의미이다.

 

getopts “인자리스트” opt 에서 opt 는 입력인자를 하나씩 받고 case 구문에서 값을 체크하게 된다. 추가 인자를 가져가는 ‘l’ 옵션의 경우 $OPTARG 를 사용해 옵션에 대한 실값을 얻어낼 수 있다.

3.     Scenario

구구단을 만들어라.

사용자의 -n 에 대해 n 단의 구구단을 출력한다. ( -l 2 : 2단을 출력 )

n 단을 Ascending 할지 Descending 할지 결정한다. ( -l 2 [ -A | -D ] )

n 단을 세로 출력할지 가로 출력할지 결정한다. (-l 2 [ -H | -V ] )

 

4.     PRACTICE

#!/bin/bash

while getopts ":l:ADVH" opt;

do

        case $opt in

        l) echo

                export g_opt=$OPTARG;;

        A) echo 'A option'

                export sort='A';;

        D) echo 'D option'

                export sort='D';;

        V) echo 'V option'

                export print='V';;

        H) echo 'H option'

                export print='H';;

        \?) echo 'usage : commnad [-l] [ -A | -D ] [ -V | -H ] args...'

        exit 1

        esac

done

shift $(($OPTIND - 1))

 

if [ ${print:-V} = 'H' ]; then                                  #print Horizontaly

        if [ ${sort:-A} = 'D' ]; then                           #sort with Descending option

                for (( i=9; i>0; i-- ))

                do

                        echo -n ${g_opt}

                        echo -n \*

                        echo -n ${i}

                        echo -n =

                        echo -n "$((${g_opt}*${i})) "

                done

 

        else

                for (( i=1; i<10; i++ ))                        #sort with Ascending option

                do

                        echo -n ${g_opt}

                        echo -n \*

                        echo -n ${i}

                        echo -n =

                        echo -n "$((${g_opt}*${i})) "

                done

        fi

else                                                            #print vertically

        if [ ${sort:-A} = 'D' ]; then                           #sort with Descending option

                for (( i=9; i>0; i-- ))

                do

                        echo -n ${g_opt}

                        echo -n \*

                        echo -n ${i}

                        echo -n =

                        echo $((${g_opt}*${i}))

                done

else                                                    #sort with Ascending option

                for (( i=1; i<10; i++ ))

                do

                        echo -n ${g_opt}

                        echo -n \*

                        echo -n ${i}

                        echo -n =

                        echo $((${g_opt}*${i}))

                done

        fi

fi

 

echo ""

 

앞서 예제로 든 getopts 옵션을 그대로 사용했다.

여기서 유의할 점은 getopts 안에서 얻어진 변수를 해당 제어문 밖에서 사용하기 위한 방법이다.

 

위에서는 export variable 을 사용하여 제어문 밖에서도 사용할 수 있게 하였다.

 

그 이후는 얻어진 변수를 이용해 제어 흐름제어를 하면 완료된다.

(위에서는 2지선다 옵션에 대한 - 이를테면 -A | -D , -V | -H 에 대해 옵션이 두개 사용되었을 때의 예외에 대한 처리를 하지 않았다.)

 

5.     REFERENCE

A.     Learning the bash Shell | O’REILLY