GETOPT(3)

명칭
getopt - 명령행의 인수 리스트로부터의 옵션 캐릭터의 취득

프로그램 라이브러리
libc

서식
<unistd.h> extern char *optarg; extern int optind; extern int optopt; extern int opterr; extern int optreset; int getopt(int argc, char * const *argv, const char *optstring)

해설
getopt() 함수는, 명령행의 인수 리스트 argv (을)를 순서대로적으로 해석해, 다음의 기존 옵션 캐릭터를 돌려줍니다. 수락 옵션 캐릭터 집합의 캐릭터 라인 optstring (으)로 지정되어 있었을 경우, 그 옵션 캐릭터는 기존 입니다.

옵션 캐릭터 라인 optstring (은)는 다음의 요소 포함할 수 있습니다. 그것은, 개개의 캐릭터와 후에 코론이 붙은 캐릭터입니다. 코론 첨부의 캐릭터는, 후에 옵션의 인수가 계속되는 것을 의미합니다. 예를 들어, 옵션 캐릭터 라인 "x" (은)는 옵션 “-x” (을)를 받아들여 옵션 캐릭터 라인 "x:" (은)는 옵션과 인수 “-x -argument” (을)를 받아들입니다. 후에 계속되는 인수의 머리에 공백이 있어도, getopt() (은)는 상관하지 않습니다.

getopt() (으)로부터 돌아왔을 때, optarg (은)는, 그것이 예기 되고 있으면 옵션의 인수를 나타내고 있어 변수 optind 에는, 이후의 getopt() 호출로 사용하는 다음의 argv 인수의 인덱스가 포함됩니다. 또 변수 optopt (은)는, getopt() 에 의해 돌려주어진 마지막 기존 옵션 캐릭터를 보존하고 있습니다.

변수 opterr 및 optind (은)는 어느쪽이나 1 에 초기화됩니다. 일련의 getopt() 호출 전이라면, 몇개의 argv 엔트리를 뛰어넘기 위해서(때문에), optind 변수를 다른 값으로 설정할 수 있습니다.

복수 세트의 인수의 평가, 또는 1 개의 인수 세트의 여러 차례 평가를 위해서(때문에) getopt() (을)를 사용하는 경우, 2 번째 이후 행해지는 추가의 각 일련의 getopt() 호출전에, 변수 optreset (을)를 1 으로 설정해, 변수 optind (을)를 재초기화할 필요가 있습니다.

getopt() 함수는, 인수 리스트를 다 써 버렸을 경우 -1 를, 받아들여지지 않는다 옵션을 만났을 경우는 ‘?’ (을)를 돌려줍니다. 인수 리스트에 있는 옵션의 해석은, 옵션 ‘--’ (2 겹의 데쉬)에 의해 취소할 수가 있습니다. 이 옵션에 의해, getopt() (은)는 인수 처리의 마지막을 전해-1 를 돌려줍니다. 모든 옵션의 처리가 끝나면(자) (즉, 최초의 비옵션 인수를 만나면(자)) getopt() (은)는 -1 을 돌려줍니다.

진단
캐릭터 라인 optstring 에 없는 캐릭터를 만나는지, 또는 옵션 인수의 결핍을 검출하면(자), getopt() 함수는 에러 메세지를 stderr 에 써내 ‘?’ (을)를 돌려줍니다. opterr (을)를 0 으로 설정하면(자), 이러한 에러 메세지는 무효가 됩니다. optstring 의 머리에 ‘’: (을)를 붙이면, 옵션 인수에 결핍이 있었을 경우, 모든 에러 메세지를 억제한 다음 ‘’: 하지만 돌아갑니다.

옵션 인수를 “-” 그리고 개시 가능합니다. 이것은 합리적입니다만, 반면에서 가능한 에러 체크 회수를 줄인다고 하는 불리가 있습니다.

확장
getopt() 함수의 여러 차례 호출을 가능하게 하기 위한(해), optreset 변수가 추가되었습니다. 이것은 p1003.2 표준에의 확장입니다.

사용예
    int bflag, ch, fd;
    bflag = 0;
    while ((ch = getopt(argc, argv, "bf:")) ! = -1)
    	switch (ch) {
    	case 'b':
    		bflag = 1;
    		break;
    	case 'f':
    		if ((fd = open(optarg, O_RDONLY, 0)) < 0)
    			err(1, "%s", optarg);
    		break;
    	case '? ':
    	default:
    		usage();
    	}
    argc -= optind;
    argv += optind;

역사
getopt() 함수는 4.3BSD 그리고 처음 등장했습니다.

버그
일찌기 getopt() 함수는,-1 대신에 EOF (을)를 돌려주도록(듯이) 정해져 있었습니다. 이 사양은, getopt() (을)를 <stdio.h> (으)로부터 떼어내기 위해서(때문에) p1003.2-92 그리고 변경되었습니다.

관련하는 인수를 가지는 것은 결코 용서되지 않습니다만, optstring 의 캐릭터로서 단일 데쉬 “-” 도 지정할 수 있습니다. 이 때문에, 옵션 플래그로서 “-” (을)를 기대하고 있는 프로그램에서도, getopt() (을)를 사용 가능합니다. 그러나, 이것은 좋은 방법이 아닙니다. 현재의 어떠한 프로그램 개발에서도, 이것을 사용해야 하는 것이 아닙니다. 하위 호환이기 때문에 만 에 존재합니다. 디폴트로 단일 데쉬는, getopt() 에 -1 를 돌려주게 합니다. 이것은 System V 와 호환일 것입니다.

옵션 캐릭터로서 숫자도 사용할 수 있습니다. 이 때문에, 옵션으로서 숫자 (“-3”) (을)를 기대하고 있는 프로그램에서도 getopt() (을)를 사용 가능합니다. 그러나, 이것은 좋은 방법이 아닙니다. 현재의 어떠한 프로그램 개발에서도, 이것을 사용해야 하는 것이 아닙니다. 하위 호환이기 때문에 만 에 존재합니다. 다음의 코드 fragment가, 대부분의 경우 (에서도 모두는 아니다)에 동작합니다.

    int length;
    char *p, *ep;
    while ((ch = getopt(argc, argv, "0123456789")) ! = -1)
    	switch (ch) {
    	case '0': case '1': case '2': case '3': case '4':
    	case '5': case '6': case '7': case '8': case '9':
    		p = argv[optind - 1];
    		if (p[0] == '-' && p[1] == ch && ! p[2])
    			length = strtol(++p, &ep, 10);
    		else if (argv[optind] && argv[optind][1] == ch) {
    			length = strtol((p = argv[optind] + 1),
    			    &ep, 10);
    			optind++;
    			optreset = 1;
    		} else
    			usage();
    		if (*ep ! = ' ')
    			errx(EX_USAGE, "illegal number -- %s", p);
    		break;
    	}