GETOPT(1)

명칭
getopt - 명령행 옵션의 해석을 실시한다

서식
args=`getopt optstring $*` ; errcode=$? ; set -- $args

해설
getopt 유틸리티는, 시르프로시쟈에 의해 간단하게 해석할 수 있도록(듯이) 명령행상의 옵션을 분리합니다. 그리고, 올바른 옵션일까를 확인합니다. optstring (은)는, 인식되는 옵션 캐릭터의 캐릭터 라인입니다 ( getopt(3) (을)를 참조). 옵션 캐릭터의 후에 코론 (``:'')이 있는 경우, 그 옵션은, (공백 캐릭터로 단락지어지고 있을지도 모르다) 인수를 가지게 됩니다. 특별한 옵션 ‘--’ (은)는, 옵션의 끝을 구별하기 위해서 사용됩니다. getopt 유틸리티는, 옵션의 마지막에 인수로서 ‘--’ (을)를 배치합니다. 또는, 그것이 햇빛에 사용되었을 때는 그것을 끝이라고 인식합니다. 셸 변수 ($1 $2 ...)(은)는, 개개의 옵션이 ‘-’ 에 계속되도록(듯이) 재설정됩니다. 그리고, 그것 자신을 셸 변수로 합니다. 각 옵션 인수는, 똑같이 그것용의 셸 변수에 넣어집니다.

사용예
이하의 코드의 단편은, 인수 없음의 -a, -b 옵션과 인수 있는 -o 옵션을 취하려 하고 있는 명령을 위해서(때문에), 어떻게 해 인수를 처리하는지를 나타내고 있습니다.

    args=`getopt abo: $*`
    # `getopt abo: "$@"` 를 사용해 되지 않습니다.
    # 이하의 set 명령와는 다른 것처럼, 당겨 수를 해석해 버리기 (위해)때문입니다.
    if [ $?  ! = 0 ]
    then
    	echo 'Usage: ...'
    	exit 2
    fi
    set -- $args
    # set 명령을, 박크크트 한 getopt 와 함께, 직접 사용할 수 없습니다.
    # getopt 의 종료 코드가 set 의 것으로 숨겨져 버리기 때문입니다.
    # set 의 종료 코드는 0 으로 정의되고 있습니다.
    for i
    do
    	case "$i"
    	in
    		-a|-b)
    			echo flag $i set; sflags="${i#-}$sflags";
    			shift;;
    		-o)
    			echo oarg is "'"$2"'"; oarg="$2"; shift;
    			shift;;
    		--)
    			shift; break;;
    	esac
    done
    echo single-char flags: "'"$sflags"'"
    echo oarg is "'"$oarg"'"

이 코드는, 이하의 (명령 지정의) 예의 어떤 것에서도 똑같이 받아들입니다.

    cmd -aoarg file file
    cmd -a -o arg file file
    cmd -oarg -a file file
    cmd -a -oarg -- file file

관련 항목
sh(1), getopt(3)

진단
getopt 유틸리티는, optstring 안에 포함되지 않은 옵션 캐릭터를 만났을 때에, 표준 에러 출력에 에러 메세지를 표시해, 0 보다 큰 상태로 종료합니다.

역사
Bell Labs 의 메뉴얼을 바탕으로, Henry Spencer 하지만 썼습니다. 행동은, Bell Labs 판과 같다라고 믿고 있습니다. 사용예는 FreeBSD 버젼 3.2 로 4.0 으로 변경했습니다.

버그
getopt(3) 하지만 가지고 있는 버그는, 그대로 가지고 있습니다.

공백 캐릭터나 쉘의 메타캐라크타를 포함한 인수는, 일반적으로 원인 채 남지 않습니다. 이것은 고치는 것은 간단하게 생각됩니다만, 그렇지는 않습니다. getopt (이)나 본메뉴얼의 사용예를 고치려고 하는 사람은, FreeBSD 안의 이 파일의 히스토리를 확인해야 합니다.

부정한 옵션에 대한 에러 메세지는, getopt (을)를 실행하는 시르프로시쟈로부터 돌려주는 것이 아니라, getopt (으)로부터 돌려주어집니다. 이것도 고치는 것은 곤란합니다.

쉘 옵션의 값을 분리하는 것 없고, 인수를 지정하기 위한 set 명령을 사용하기 위한 매우 좋은 방법은, 쉘의 버젼을 바꾸는 것입니다.

당겨 수를 부분적으로 올바르게 해석하기 위해서, 각 셸 스크립트는 (전기 사용 예의 같은) 복잡한 코드를 가질 필요가 있습니다. 보다 좋은 getopt 적 툴은, 복잡한 부분의 대부분을 툴안으로 이동해, 클라이언트의 셸 스크립트를 단순하게 하는 것이지요.