본문 바로가기
프로그램/Linux

[스크립트] getopt 사용법

by 고무다라 2014. 12. 3.
반응형

getopt 사용법



슬퍼2안녕하세요? 고무다라입니다. 최근 Bash shell script를 볼 일이 있었는데, getopt에서 옵션을 잘못 주어 한참 헤맨 경우가 있었습니다. getopt의 옵션을 줄때, 기본적인 -옵션을 제대로 주지 않아 엉뚱한 명령어 수행으로 수정한 소스를 원복하는 경우가 있었습니다.


소스 빌드 과정에서 Makefile에 의해 소스가 다른데서 복사되어 오는 형태인줄 알았으나, 아래 코드로 인해, 작업한 모든 내용을 git command에 의해 원래 상태로 되돌리는 원복 명령어 수행이 이루어 졌습니다. ㅠ.ㅠ


    git clean -xdf

    git reset HEAD --hard


물론 스크립트에서 옵션 필터링을 제대로 안해준 문제도 있지만, 아무튼 이로 인해서 getopt에 대해 한번 찾아보게 되었네요. 유분투에서 컴파일 하는 환경이라 getoptman 페이지를 확인해 보면 아래와 같습니다.


GETOPT(1)                        User Commands                       GETOPT(1)


NAME

       getopt - parse command options (enhanced)


SYNOPSIS

       getopt optstring parameters

       getopt [options] [--] optstring parameters

       getopt [options] -o|--options optstring [options] [--] parameters


DESCRIPTION

       getopt  is  used  to break up (parse) options in command lines for easy

       parsing by shell procedures, and to check for legal options.   It  uses

       the GNU getopt(3) routines to do this.


       The  parameters  getopt  is  called with can be divided into two parts:

       options  which  modify  the  way  getopt  will   parse   (options   and

       -o|--options  optstring  in the SYNOPSIS), and the parameters which are

       to be parsed (parameters in the SYNOPSIS).  The second part will  start

       at  the  first  non-option parameter that is not an option argument, or

       after the first occurrence of `--'.  If no `-o' or  `--options'  option

       is  found  in the first part, the first parameter of the second part is

       used as the short options string.

...

EXAMPLES

       Example  scripts  for (ba)sh and (t)csh are provided with the getopt(1)

       distribution, and  are  optionally  installed  in  /usr/share/doc/util-

       linux/examples.

...



man 에서 알려주는 /usr/share/doc/util-linux/examples 경로에서 getopt-parse.bash 를 아래와 같이 확인하면 보다 정확히 이해 할 수 있습니다.


#!/bin/bash


# A small example program for using the new getopt(1) program.

# This program will only work with bash(1)

# An similar program using the tcsh(1) script language can be found

# as parse.tcsh


# Example input and output (from the bash prompt):

# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "

# Option a

# Option c, no argument

# Option c, argument `more'

# Option b, argument ` very long '

# Remaining arguments:

# --> `par1'

# --> `another arg'

# --> `wow!*\?'


# Note that we use `"$@"' to let each command-line parameter expand to a 

# separate word. The quotes around `$@' are essential!

# We need TEMP as the `eval set --' would nuke the return value of getopt.

TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \

     -n 'example.bash' -- "$@"`


if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi


# Note the quotes around `$TEMP': they are essential!

eval set -- "$TEMP"


while true ; do

case "$1" in

-a|--a-long) echo "Option a" ; shift ;;

-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;

-c|--c-long) 

# c has an optional argument. As we are in quoted mode,

# an empty parameter will be generated if its optional

# argument is not found.

case "$2" in

"") echo "Option c, no argument"; shift 2 ;;

*)  echo "Option c, argument \`$2'" ; shift 2 ;;

esac ;;

--) shift ; break ;;

*) echo "Internal error!" ; exit 1 ;;

esac

done

echo "Remaining arguments:"

for arg do echo '--> '"\`$arg'" ; done



위 bash 스크립트를 실행하면 아래와 같은 동작을 보입니다.


1) -옵션 없이 a 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash a

Remaining arguments:

--> `a'


2) -a 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash -a

Option a

Remaining arguments:


3) -a -b -c 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash -a -b -c

Option a

Option b, argument `-c'

Remaining arguments:


4) -abc 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash -abc

Option a

Option b, argument `c'

Remaining arguments:


5) -abcd 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash -abcd

Option a

Option b, argument `cd'

Remaining arguments:


6) -abcd -b 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash -abcd -b

example.bash: option requires an argument -- 'b'

Terminating...


7) -abcd -bc -cc -conemore -a 옵션으로 실행

/usr/share/doc/util-linux/examples$ ./getopt-parse.bash -abcd -bc -cc -conemore -a

Option a

Option b, argument `cd'

Option b, argument `c'

Option c, argument `c'

Option c, argument `onemore'

Option a

Remaining arguments:


위 예제에서 보면, 인자로 -a, -b 를 받고 있으며, -b의 경우로 추가 인자를 받고 있음을 알 수 있습니다. - 옵션 없이 할 경우 Remaininng arguments에 표시 됩니다.


또한 getopt는 C, perl 코드상에서 사용할 수 있습니다[각주:1].

하트3

끝.

  1. http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html#Example-of-Getopt [본문으로]
반응형

'프로그램 > Linux' 카테고리의 다른 글

폴더 소스 비교  (0) 2014.09.22
바이너리 파일안의 문자열 검색 방법  (0) 2013.07.05

댓글