getopt(3) - wariua/manpages-ko GitHub Wiki

NAME

getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - λͺ…λ Ήν–‰ μ˜΅μ…˜ νŒŒμ‹±

SYNOPSIS

#include <unistd.h>

int getopt(int argc, char * const argv[],
           const char *optstring);

extern char *optarg;
extern int optind, opterr, optopt;

#include <getopt.h>

int getopt_long(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);

int getopt_long_only(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);

glibc κΈ°λŠ₯ 확인 맀크둜 μš”κ±΄ (feature_test_macros(7) μ°Έκ³ ):

getopt():
_POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE
getopt_long(), getopt_long_only():
_GNU_SOURCE

DESCRIPTION

getopt() ν•¨μˆ˜λŠ” λͺ…λ Ήν–‰ μΈμžλ“€μ„ νŒŒμ‹± ν•œλ‹€. 인자 argc와 argvλŠ” ν”„λ‘œκ·Έλž¨ 호좜 μ‹œ main() ν•¨μˆ˜λ‘œ μ „λ‹¬λœ 인자 개수 및 배열이닀. argv의 ν•­λͺ© 쀑 '-'둜 μ‹œμž‘ν•˜λŠ” (κ·ΈλŸ¬λ©΄μ„œ "-"μ΄λ‚˜ "--"λŠ” μ•„λ‹Œ) 게 μ˜΅μ…˜ ν•­λͺ©μ΄λ‹€. κ·Έ ν•­λͺ©μ˜ (처음 '-'λ₯Ό μ œμ™Έν•œ) λ¬Έμžλ“€μ΄ μ˜΅μ…˜ λ¬Έμžμ΄λ‹€. getopt()λ₯Ό λ°˜λ³΅ν•΄μ„œ ν˜ΈμΆœν•˜λ©΄ μ˜΅μ…˜ ν•­λͺ© 각각의 μ˜΅μ…˜ 문자 각각을 μ°¨λ‘€λ‘œ λ°˜ν™˜ν•œλ‹€.

λ³€μˆ˜ optindλŠ” argvμ—μ„œ λ‹€μŒμœΌλ‘œ μ²˜λ¦¬ν•  ν•­λͺ©μ˜ μΈλ±μŠ€μ΄λ‹€. μ‹œμŠ€ν…œμ—μ„œ 이 값을 1둜 μ΄ˆκΈ°ν™” ν•œλ‹€. ν˜ΈμΆœμžκ°€ 이 값을 1둜 μž¬μ„€μ •ν•΄μ„œ λ™μΌν•œ argvλ₯Ό λ‹€μ‹œ ν›‘κ±°λ‚˜ μƒˆλ‘œμš΄ 인자 벑터λ₯Ό 훑을 수 μžˆλ‹€.

getopt()μ—μ„œ μ˜΅μ…˜ 문자λ₯Ό 또 찾으면 κ·Έ 문자λ₯Ό λ°˜ν™˜ν•˜κ³ , μ™ΈλΆ€ λ³€μˆ˜ optind와 정적 λ³€μˆ˜ nextcharλ₯Ό κ°±μ‹ ν•΄μ„œ λ‹€μŒ getopt() ν˜ΈμΆœμ—μ„œ κ·Έ λ‹€μŒ μ˜΅μ…˜ 문자 λ‚΄μ§€ argv ν•­λͺ©μ„ 계속 훑을 수 μžˆλ„λ‘ ν•œλ‹€.

μ˜΅μ…˜ λ¬Έμžκ°€ λ”λŠ” μ—†μœΌλ©΄ getopt()κ°€ -1을 λ°˜ν™˜ν•œλ‹€. κ·Έλ•Œ optindλŠ” μ˜΅μ…˜μ΄ μ•„λ‹Œ 첫 번째 argv ν•­λͺ©μ˜ argv λ‚΄ μΈλ±μŠ€μ΄λ‹€.

optstring은 μœ νš¨ν•œ μ˜΅μ…˜ λ¬Έμžλ“€μ„ 담은 λ¬Έμžμ—΄μ΄λ‹€. κ·Έ 문자 뒀에 콜둠이 있으면 μ˜΅μ…˜μ— μΈμžκ°€ μžˆμ–΄μ•Ό ν•˜λ©° getopt()μ—μ„œλŠ” 같은 argv ν•­λͺ© λ‚΄μ˜ λ‹€μŒ ν…μŠ€νŠΈλ‚˜ λ‹€μŒ argv ν•­λͺ©μ˜ ν…μŠ€νŠΈμ— λŒ€ν•œ 포인터λ₯Ό optarg에 μ§‘μ–΄λ„£λŠ”λ‹€. 콜둠이 두 개면 κ·Έ μ˜΅μ…˜μ΄ 선택적 인자λ₯Ό λ°›λŠ”λ‹€λŠ” λœ»μ΄λ‹€. ν˜„μž¬ argv ν•­λͺ© 내에 ν…μŠ€νŠΈκ°€ 있으면 (즉 동일 단어에 μ˜΅μ…˜ 이름과 ν•¨κ»˜ 있으면, "-oarg"처럼) optarg둜 λ°˜ν™˜λ˜κ³  μ•„λ‹ˆλ©΄ optargκ°€ 0으둜 μ„€μ •λœλ‹€. 이 방식은 GNU ν™•μž₯이닀. 그리고 optstring에 Wκ°€ 있고 μ„Έλ―Έμ½œλ‘ μ΄ λ”°λΌμ˜€λ©΄ -W fooλ₯Ό κΈ΄ μ˜΅μ…˜ --foo처럼 닀룬닀. (-W μ˜΅μ…˜μ€ POSIX.2μ—μ„œ κ΅¬ν˜„ ν™•μž₯용으둜 μ˜ˆμ•½λΌ μžˆλ‹€.) 이 λ™μž‘ 방식은 GNU ν™•μž₯이며 glibc 2 μ „μ˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ‹€.

기본적으둜 getopt()μ—μ„œλŠ” argv의 λ‚΄μš©λ¬Όμ„ μ„œλ‘œ λ°”κΏ”μ„œ μ΅œμ’…μ μœΌλ‘œ μ˜΅μ…˜ μ•„λ‹Œ 것듀이 λ’€λ‘œ κ°€κ²Œ ν•œλ‹€. 그와 λ‹€λ₯Έ λ™μž‘ 방식도 두 κ°€μ§€ κ΅¬ν˜„λΌ μžˆλ‹€. optstring의 첫 λ¬Έμžκ°€ '+'μ΄κ±°λ‚˜ ν™˜κ²½ λ³€μˆ˜ POSIXLY_CORRECTκ°€ 섀정돼 있으면 μ˜΅μ…˜ μ•„λ‹Œ 인자λ₯Ό λ§Œλ‚˜μžλ§ˆμž 처리λ₯Ό λ©ˆμΆ˜λ‹€. 또 optstring의 첫 λ¬Έμžκ°€ '-'이면 μ˜΅μ…˜ μ•„λ‹Œ argv ν•­λͺ© 각각을 문자 μ½”λ“œκ°€ 1인 μ˜΅μ…˜μ˜ 인자인 κ²ƒμ²˜λŸΌ μ²˜λ¦¬ν•œλ‹€. (μ˜΅μ…˜κ³Ό λ‹€λ₯Έ argv ν•­λͺ©λ“€μ„ 아무 μˆœμ„œλ‘œλ‚˜ 받을 수 있고 κ·Έ λ‘˜μ—μ„œμ˜ μˆœμ„œμ— 관심 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ 이 방식을 μ“΄λ‹€.) ν›‘λŠ” 방식이 뭐든 간에 특수 인자 "--"λŠ” μ˜΅μ…˜ 탐색을 κ°•μ œλ‘œ 끝낸닀.

μ˜΅μ…˜ λͺ©λ‘μ„ μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ getopt()λŠ” 두 κ°€μ§€ 였λ₯˜λ₯Ό 탐지할 수 μžˆλ‹€. (1) optstring에 μ§€μ •ν•˜μ§€ μ•Šμ€ μ˜΅μ…˜ λ¬Έμžκ°€ μžˆλŠ” κ²½μš°μ™€ (2) μ˜΅μ…˜ μΈμžκ°€ λΉ μ Έ μžˆλŠ” 경우(즉 λͺ…λ Ήν–‰ λ§ˆμ§€λ§‰ μ˜΅μ…˜μ— ν•„μˆ˜ μΈμžκ°€ μ—†λŠ” 경우)이닀. 그런 였λ₯˜λ“€μ„ λ‹€μŒκ³Ό 같이 μ²˜λ¦¬ν•˜κ³  λ³΄κ³ ν•œλ‹€.

  • κΈ°λ³Έμ μœΌλ‘œλŠ” getopt()μ—μ„œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν‘œμ€€ 였λ₯˜λ‘œ 찍고, 문제의 μ˜΅μ…˜ 문자λ₯Ό optopt에 μ§‘μ–΄λ„£κ³ , ν•¨μˆ˜ 결과둜 '?'λ₯Ό λ°˜ν™˜ν•œλ‹€.

  • ν˜ΈμΆœμžκ°€ μ „μ—­ λ³€μˆ˜ opterrλ₯Ό 0으둜 μ„€μ •ν–ˆμœΌλ©΄ getopt()μ—μ„œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 찍지 μ•ŠλŠ”λ‹€. ν˜ΈμΆœμžλŠ” ν•¨μˆ˜ λ°˜ν™˜ 값이 '?'인지 κ²€μ‚¬ν•΄μ„œ 였λ₯˜κ°€ μžˆμ—ˆλŠ”μ§€ μ•Œμ•„λ‚Ό 수 μžˆλ‹€. (기본적으둜 opterrλŠ” 0 μ•„λ‹Œ 값을 κ°€μ§€κ³  μžˆλ‹€.)

  • optstring의 (μœ„μ— μ„€λͺ…ν•œ 선택적 '+' λ‚΄μ§€ '-' λ‹€μŒμ˜) 첫 번째 λ¬Έμžκ°€ 콜둠(':')이면 λ§ˆμ°¬κ°€μ§€λ‘œ getopt()κ°€ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 찍지 μ•ŠλŠ”λ‹€. λ”λΆˆμ–΄ λΉ μ§„ μ˜΅μ…˜ 인자λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데 '?' λŒ€μ‹  ':'λ₯Ό λ°˜ν™˜ν•œλ‹€. κ·Έλž˜μ„œ ν˜ΈμΆœμžκ°€ 두 κ°€μ§€ 였λ₯˜λ₯Ό ꡬ별할 수 있게 λœλ‹€.

getopt_long() 및 getopt_long_only()

getopt_long() ν•¨μˆ˜λŠ” getopt()처럼 λ™μž‘ν•˜λ˜ λŒ€μ‹œ 두 개둜 μ‹œμž‘ν•˜λŠ” κΈ΄ μ˜΅μ…˜λ“€λ„ λ°›λŠ”λ‹€. (ν”„λ‘œκ·Έλž¨μ—μ„œ κΈ΄ μ˜΅μ…˜λ§Œ λ°›μœΌλ €λŠ” κ²½μš°μ—λŠ” optstring을 NULLμ•„ μ•„λ‹ˆλΌ 빈 λ¬Έμžμ—΄("")둜 μ§€μ •ν•΄μ•Ό ν•œλ‹€.) 짧게 쀄인 μ˜΅μ…˜ λ¬Έμžκ°€ μœ μΌν•˜κ±°λ‚˜ 이미 μ •μ˜λœ μ–΄λ–€ μ˜΅μ…˜κ³Ό μΌμΉ˜ν•˜λŠ” κ²½μš°μ—λŠ” κΈ΄ μ˜΅μ…˜ 이름을 μΆ•μ•½ν•  μˆ˜λ„ μžˆλ‹€. κΈ΄ μ˜΅μ…˜μ—μ„œλŠ” --arg=paramμ΄λ‚˜ --arg param ν˜•νƒœλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό 받을 수 μžˆλ‹€.

longoptsλŠ” <getopt.h>에 λ‹€μŒμ²˜λŸΌ μ„ μ–Έλœ struct option의 λ°°μ—΄ 첫 ν•­λͺ©μ„ κ°€λ¦¬ν‚€λŠ” 포인터이닀.

struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};

각 ν•„λ“œμ˜ μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

name
κΈ΄ μ˜΅μ…˜μ˜ 이름이닀.
has_arg
no_argument(0)이면 μ˜΅μ…˜μ— 인자λ₯Ό λ°›μ§€ μ•Šκ³ , required_argument(1)이면 μ˜΅μ…˜μ— μΈμžκ°€ ν•„μˆ˜μ΄κ³ , optional_argument(2)이면 μ˜΅μ…˜μ—μ„œ 선택적 인자λ₯Ό λ°›λŠ”λ‹€.
flag
κΈ΄ μ˜΅μ…˜μ— λŒ€ν•œ κ²°κ³Όλ₯Ό μ–΄λ–»κ²Œ λ°˜ν™˜ν•˜λŠ”μ§€ μ§€μ •ν•œλ‹€. flagκ°€ NULL이면 getopt_long()이 val을 λ°˜ν™˜ν•œλ‹€. (예λ₯Ό λ“€μ–΄ 호좜 ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” val을 λŒ€μ‘ν•˜λŠ” 짧은 μ˜΅μ…˜ 문자둜 μ„€μ •ν•  수 μžˆλ‹€.) μ•„λ‹ˆλ©΄ getopt_long()이 0을 λ°˜ν™˜ν•˜λ©°, μ˜΅μ…˜μ„ μ°Ύμ•˜μœΌλ©΄ flagκ°€ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜λ₯Ό val둜 μ„€μ •ν•˜κ³  μ°Ύμ§€ λͺ»ν–ˆμœΌλ©΄ κ·ΈλŒ€λ‘œ λ‘”λ‹€.
val
λ°˜ν™˜λ˜λŠ” κ°’, λ˜λŠ” flagκ°€ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜μ— 넣을 κ°’.

λ°°μ—΄ λ§ˆμ§€λ§‰ ν•­λͺ©μ΄ 0으둜 μ±„μ›Œμ Έ μžˆμ–΄μ•Ό ν•œλ‹€.

longindexκ°€ NULL이 μ•„λ‹ˆλ©΄ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜λ₯Ό longoptsμ—μ„œμ˜ κΈ΄ μ˜΅μ…˜ 인덱슀둜 μ„€μ •ν•œλ‹€.

getopt_long_only()λŠ” getopt_long()`κ³Ό λΉ„μŠ·ν•˜λ˜ "--"뿐 μ•„λ‹ˆλΌ '-'λ‘œλ„ κΈ΄ μ˜΅μ…˜μ„ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. '-'둜 ("--" μ•„λ‹˜) μ‹œμž‘ν•˜λŠ” μ˜΅μ…˜κ³Ό μΌμΉ˜ν•˜λŠ” κΈ΄ μ˜΅μ…˜μ΄ μ—†κ³  짧은 μ˜΅μ…˜μ€ μžˆλŠ” κ²½μš°μ—λŠ” 짧은 μ˜΅μ…˜μœΌλ‘œ νŒŒμ‹± ν•œλ‹€.

RETURN VALUE

μ˜΅μ…˜μ„ μ„±κ³΅μ μœΌλ‘œ 찾은 경우 getopt()κ°€ μ˜΅μ…˜ 문자λ₯Ό λ°˜ν™˜ν•œλ‹€. λͺ…λ Ήν–‰ μ˜΅μ…˜λ“€μ„ λͺ¨λ‘ νŒŒμ‹± ν–ˆμœΌλ©΄ getopt()κ°€ -1을 λ°˜ν™˜ν•œλ‹€. optstring에 μ—†λŠ” μ˜΅μ…˜ 문자λ₯Ό λ§Œλ‚¬μœΌλ©΄ getopt()κ°€ '?'을 λ°˜ν™˜ν•œλ‹€. μΈμžκ°€ λΉ μ Έ μžˆλŠ” μ˜΅μ…˜μ„ λ§Œλ‚¬μœΌλ©΄ optstring의 첫 λ¬Έμžμ— 따라 λ°˜ν™˜ 값이 μ •ν•΄μ§„λ‹€. 즉 첫 λ¬Έμžκ°€ ':'이면 ':'을 λ°˜ν™˜ν•˜κ³  μ•„λ‹ˆλ©΄ '?'λ₯Ό λ°˜ν™˜ν•œλ‹€.

getopt_long()κ³Ό getopt_long_only()도 짧은 μ˜΅μ…˜μ„ μΈμ‹ν–ˆμ„ λ•ŒλŠ” μ˜΅μ…˜ 문자λ₯Ό λ°˜ν™˜ν•œλ‹€. κΈ΄ μ˜΅μ…˜μΈ κ²½μš°μ—λŠ” flagκ°€ NULL이면 val을 λ°˜ν™˜ν•˜κ³  μ•„λ‹ˆλ©΄ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ 및 -1 λ°˜ν™˜μ€ getopt()μ—μ„œμ™€ κ°™μœΌλ©°, μΆ”κ°€λ‘œ μ—¬λŸ¬ κ°€μ§€λ‘œ 해석할 수 μžˆλŠ” κ²½μš°λ‚˜ λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” κ²½μš°μ— '?'λ₯Ό λ°˜ν™˜ν•œλ‹€.

ENVIRONMENT

POSIXLY_CORRECT
μ„€μ •λœ 경우 μ˜΅μ…˜ μ•„λ‹Œ 인자λ₯Ό λ§Œλ‚˜μžλ§ˆμž μ˜΅μ…˜ 처리λ₯Ό λ©ˆμΆ˜λ‹€.
_<PID>_GNU_nonoption_argv_flags_
bash(1) 2.0μ—μ„œ 이 λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆλŠ”λ° μ–΄λ–€ μΈμžκ°€ μ™€μΌλ“œμΉ΄λ“œ ν™•μž₯의 κ²°κ³Όμ΄λ―€λ‘œ μ˜΅μ…˜μœΌλ‘œ 닀뀄선 μ•ˆ λœλ‹€λŠ” κ±Έ glibcμ—κ²Œ μ•Œλ € μ£ΌλŠ” μš©λ„μ˜€λ‹€. bash(1) 버전 2.01μ—μ„œ 이 λ™μž‘μ΄ μ œκ±°λ˜μ—ˆμ§€λ§Œ glibcμ—λŠ” 지원이 남아 μžˆλ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
getopt(), getopt_long(),
getopt_long_only()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Unsafe race:getopt env

CONFORMING TO

getopt():

ν™˜κ²½ λ³€μˆ˜ POSIXLY_CORRECTκ°€ 섀정돼 μžˆλ‹€λ©΄ POSIX.1-2001, POSIX.1-2008, POSIX.2. μ•„λ‹ˆλΌλ©΄ argv의 ν•­λͺ©λ“€μ„ κ΅ν™˜μ΄ κ°€λŠ₯ν•΄μ•Ό ν•˜λ―€λ‘œ μ§„μ§œ constκ°€ μ•„λ‹ˆλ‹€. λ‹€λ₯Έ μ‹œμŠ€ν…œκ³Όμ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ μ›ν˜•μ—μ„œλŠ” const인 κ²ƒμ²˜λŸΌ ν•œλ‹€.

optstring에 '+' 및 '-'λ₯Ό μ“°λŠ” 것은 GNU ν™•μž₯이닀.

일뢀 ꡬ식 κ΅¬ν˜„λ“€μ—μ„œλŠ” getopt()κ°€ <stdin.h>에 선언돼 μžˆμ—ˆλ‹€. SUSv1μ—μ„œλŠ” 선언이 <unistd.h>와 <stdio.h> μ–΄λŠ μͺ½μ—μ„œ λ‚˜μ˜€λ“  ν—ˆμš©ν–ˆλ‹€. POSIX.1-1996μ—μ„œ 이 μš©λ„μ— <stdio.h>λ₯Ό μ“°λŠ” 것을 LEGACY둜 ν‘œμ‹œν–ˆλ‹€. POSIX.1-2001μ—μ„œλŠ” <stdio.h>에 선언이 λ‚˜μ™€μ•Ό ν•œλ‹€κ³  μš”κ΅¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

getopt_long() 및 getopt_long_only():
이 ν•¨μˆ˜λ“€μ€ GNU ν™•μž₯이닀.

NOTES

μ—¬λŸ¬ 인자 벑터λ₯Ό ν›‘κ±°λ‚˜ 같은 벑터λ₯Ό μ—¬λŸ¬ 번 λ‹€μ‹œ ν›‘λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ optstring μ„ λ‘μ˜ '+'와 '-' 같은 GNU ν™•μž₯을 μ“°κ³  μ‹Άκ±°λ‚˜ 탐색 사이에 POSIXLY_CORRECT의 값을 λ°”κΎΈκ³  싢은 κ²½μš°μ—λŠ” optindλ₯Ό (전톡적 값인 1 λŒ€μ‹ ) 0으둜 μž¬μ„€μ •ν•΄μ„œ getopt()λ₯Ό μž¬μ΄ˆκΈ°ν™” ν•΄μ•Ό ν•œλ‹€. (0으둜 μž¬μ„€μ •ν•˜λ©΄ λ‚΄λΆ€ μ΄ˆκΈ°ν™” 루틴이 ν˜ΈμΆœλΌμ„œ POSIXLY_CORRECTλ₯Ό μž¬ν™•μΈν•˜κ³  optstring의 GNU ν™•μž₯을 ν™•μΈν•œλ‹€.)

EXAMPLE

getopt()

λ‹€μŒμ˜ κ°„λ‹¨ν•œ μ˜ˆμ‹œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” getopt()λ₯Ό μ‚¬μš©ν•΄ 두 κ°€μ§€ ν”„λ‘œκ·Έλž¨ μ˜΅μ…˜μ„ μ²˜λ¦¬ν•œλ‹€. 연계 값이 μ—†λŠ” -n μ˜΅μ…˜, 그리고 μ—°κ³„λœ 값이 ν•„μš”ν•œ -t val μ˜΅μ…˜μ΄λ‹€.

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
    int flags, opt;
    int nsecs, tfnd;

    nsecs = 0;
    tfnd = 0;
    flags = 0;
    while ((opt = getopt(argc, argv, "nt:")) != -1) {
        switch (opt) {
        case 'n':
            flags = 1;
            break;
        case 't':
            nsecs = atoi(optarg);
            tfnd = 1;
            break;
        default: /* '?' */
            fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }

    printf("flags=%d; tfnd=%d; nsecs=%d; optind=%d\n",
            flags, tfnd, nsecs, optind);

    if (optind >= argc) {
        fprintf(stderr, "Expected argument after options\n");
        exit(EXIT_FAILURE);
    }

    printf("name argument = %s\n", argv[optind]);

    /* λ‚˜λ¨Έμ§€ μ½”λ“œ μƒλž΅ */

    exit(EXIT_SUCCESS);
}

getopt_long()

λ‹€μŒ μ˜ˆμ‹œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” getopt_long()의 μ—¬λŸ¬ κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” κ±Έ 보여 μ€€λ‹€.

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit  */
#include <getopt.h>

int main(int argc, char **argv) {
    int c;
    int digit_optind = 0;

    while (1) {
        int this_option_optind = optind ? optind : 1;
        int option_index = 0;
        static struct option long_options[] = {
            {"add",     required_argument, 0,  0 },
            {"append",  no_argument,       0,  0 },
            {"delete",  required_argument, 0,  0 },
            {"verbose", no_argument,       0,  0 },
            {"create",  required_argument, 0, 'c'},
            {"file",    required_argument, 0,  0 },
            {0,         0,                 0,  0 }
        };

        c = getopt_long(argc, argv, "abc:d:012",
                 long_options, &option_index);
        if (c == -1)
            break;

        switch (c) {
        case 0:
            printf("option %s", long_options[option_index].name);
            if (optarg)
                printf(" with arg %s", optarg);
            printf("\n");
            break;

        case '0':
        case '1':
        case '2':
            if (digit_optind != 0 && digit_optind != this_option_optind)
              printf("digits occur in two different argv-elements.\n");
            digit_optind = this_option_optind;
            printf("option %c\n", c);
            break;

        case 'a':
            printf("option a\n");
            break;

        case 'b':
            printf("option b\n");
            break;

        case 'c':
            printf("option c with value '%s'\n", optarg);
            break;

        case 'd':
            printf("option d with value '%s'\n", optarg);
            break;

        case '?':
            break;

        default:
            printf("?? getopt returned character code 0%o ??\n", c);
        }
    }

    if (optind < argc) {
        printf("non-option ARGV-elements: ");
        while (optind < argc)
            printf("%s ", argv[optind++]);
        printf("\n");
    }

    exit(EXIT_SUCCESS);
}

SEE ALSO

getopt(1), getsubopt(3)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️