λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
천천히, κΎΈμ€€νžˆ../C

[C : ls] ls μ˜΅μ…˜ 인자처리 #getopts

by MIMI.L 2023. 12. 17.
λ°˜μ‘ν˜•
/* OPTS에 주어진 μ˜΅μ…˜μ— λŒ€ν•΄ ARGV(ν”„λ‘œκ·Έλž¨ 이름을 λΊ€ ARGC)의 인수λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜μ˜ μ •μ˜μ™€ ν”„λ‘œν† νƒ€μž…μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.

   방금 읽은 OPTSμ—μ„œ μ˜΅μ…˜ 문자λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.  더 이상 μ˜΅μ…˜μ΄ μ—†μœΌλ©΄ -1을 λ°˜ν™˜ν•©λ‹ˆλ‹€.  인식할 수 μ—†λŠ” μ˜΅μ…˜ λ˜λŠ” μΈμˆ˜κ°€ λˆ„λ½λœ μ˜΅μ…˜μ˜ 경우 μ˜΅μ…˜ 문자둜 'optopt'κ°€ μ„€μ •λ˜κ³  '?'κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

   OPTS λ¬Έμžμ—΄μ€ μΈμ‹λ˜λŠ” μ˜΅μ…˜ 문자의 λͺ©λ‘μ΄λ©°, μ„ νƒμ μœΌλ‘œ 콜둠이 뒀에 μ™€μ„œ ν•΄λ‹Ή λ¬Έμžκ°€ 인수λ₯Ό 받도둝 μ§€μ •ν•˜μ—¬ 'optarg'에 λ°°μΉ˜ν•©λ‹ˆλ‹€.

   OPTS의 문자 뒀에 콜둠 두 κ°œκ°€ μ˜€λŠ” 경우 ν•΄λ‹Ή μΈμˆ˜λŠ” 선택 μ‚¬ν•­μž…λ‹ˆλ‹€.  이 λ™μž‘μ€ GNU 'getopt'μ—λ§Œ ν•΄λ‹Ήλ©λ‹ˆλ‹€.

   인자 '--'은 인자 검색을 쑰기에 μ’…λ£Œν•˜μ—¬ 더 이상 μ˜΅μ…˜μ΄ μ—†μŒμ„ 'getopt'에 λͺ…μ‹œμ μœΌλ‘œ μ•Œλ¦½λ‹ˆλ‹€.

   μ˜΅μ…˜μ΄ '-'둜 μ‹œμž‘ν•˜λ©΄ μ˜΅μ…˜μ΄ μ•„λ‹Œ μΈμˆ˜λŠ” μ˜΅μ…˜ '\1'에 λŒ€ν•œ 인수둜 μ·¨κΈ‰λ©λ‹ˆλ‹€.  이 λ™μž‘μ€ GNU 'getopt'μ—λ§Œ ν•΄λ‹Ήλ©λ‹ˆλ‹€.  OPTSκ°€ '+'둜 μ‹œμž‘ν•˜κ±°λ‚˜ ν™˜κ²½μ— POSIXLY_CORRECTκ°€ μ„€μ •λ˜μ–΄ 있으면 인수λ₯Ό μˆœμ—΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

   ν‘œμ€€ μ€€μˆ˜λ₯Ό μœ„ν•΄ 'argv' 인수의 μœ ν˜•μ€ 문자 *const *μ΄μ§€λ§Œ μ΄λŠ” λΆ€μ •ν™•ν•©λ‹ˆλ‹€. 인자 μˆœμ—΄μ΄ ν™œμ„±ν™”λœ 경우 μΈμžκ°€ κ°€λ¦¬ν‚€λŠ” λ¬Έμžμ—΄μ΄ μ•„λ‹Œ argv 배열은 μ“°κΈ° κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.  */

getoptλ₯Ό μ‚¬μš©ν•˜λ©΄ μ˜΅μ…˜μ²˜λ¦¬λ₯Ό νŽΈν•˜κ²Œ ν•  수 μžˆλ‹€λŠ” 짝꿍의 이야기λ₯Ό λ“£κ³ ..

ls μ˜΅μ…˜μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ getoptλ₯Ό μ•Œμ•„λ΄„

 

getoptλŠ” μ»€λ§¨λ“œλΌμΈ 인자λ₯Ό νŒŒμ‹±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜λ‘œ

μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ μ œκ³΅ν•œ μ˜΅μ…˜κ³Ό κ·Έ 인자λ₯Ό μ²˜λ¦¬ν•  수 있게 ν•œλ‹€κ³  함

 

이 ν•¨μˆ˜λ₯Ό 타고 λ“€μ–΄κ°€μ„œ 찾아보면 μ•„λž˜μ™€ 같은 λ‚΄μš©μ΄ λ‚˜μ˜΄

더보기

 

 

/* Get definitions and prototypes for functions to process the
   arguments in ARGV (ARGC of them, minus the program name) for
   options given in OPTS.

   Return the option character from OPTS just read.  Return -1 when
   there are no more options.  For unrecognized options, or options
   missing arguments, 'optopt' is set to the option letter, and '?' is
   returned.

   The OPTS string is a list of characters which are recognized option
   letters, optionally followed by colons, specifying that that letter
   takes an argument, to be placed in 'optarg'.

   If a letter in OPTS is followed by two colons, its argument is
   optional.  This behavior is specific to the GNU 'getopt'.

   The argument '--' causes premature termination of argument
   scanning, explicitly telling 'getopt' that there are no more
   options.

   If OPTS begins with '-', then non-option arguments are treated as
   arguments to the option '\1'.  This behavior is specific to the GNU
   'getopt'.  If OPTS begins with '+', or POSIXLY_CORRECT is set in
   the environment, then do not permute arguments.

   For standards compliance, the 'argv' argument has the type
   char *const *, but this is inaccurate; if argument permutation is
   enabled, the argv array (not the strings it points to) must be
   writable.  */

extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
       __THROW __nonnull ((2, 3));

 

κ·Έλž˜μ„œ 이걸 μ–΄λ–»κ²Œ μ“°λŠ”κ±΄μ§€ ?

argc와 argv 그리고 μ‚¬μš© ν•  μ˜΅μ…˜ 문자λ₯Ό 인자둜 전달해쀀닀.

 

참고둜 같이 μ•Œμ•„λ‘¬μ•Ό ν•  λ³€μˆ˜λ“€μ΄ μ—¬λŸ¬κ°œ μžˆμ§€λ§Œ.. μ΄κ²ƒλ§Œ...

optopt = ν˜„μž¬ μ²˜λ¦¬μ€‘μΈ μ˜΅μ…˜

 

그리고 λ°˜ν™˜λ˜λŠ” 값은 λ‹€μ–‘ν•œλ°...

μž…λ ₯된 μ˜΅μ…˜μΈμžλ₯Ό ν•˜λ‚˜μ”© λ°˜ν™˜

μž…λ ₯된 μΈμžκ°€ μ˜΅μ…˜μ— μ—†μœΌλ©΄ ? λ₯Ό λ°˜ν™˜

더 이상 λ°˜ν™˜ν•  것이 μ—†λ‹€λ©΄ -1 을 λ°˜ν™˜

 

μ‚¬μš© ν•  μ˜΅μ…˜μΈμžλ₯Ό μ“Έ λ•Œ, : λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”λ°

μ˜΅μ…˜μΈμžμ™€ κ°’(μΆ”κ°€μΈμž)을 같이 받고싢을 λ•Œ μ“΄λ‹€

ex. dk run -n wrf

 

예λ₯Όλ“€λ©΄ docker run -n wrf ...blabla.. λ₯Ό 보면 -n 을 μ£Όκ³ , -n에 λŒ€ν•œ κ°’ wrfλ₯Ό μ£ΌλŠ”λ°

μ΄λŸ°μ‹μœΌλ‘œ μ‚¬μš©ν•˜κ³ μž ν•  λ•Œ, : λ₯Ό μ‚¬μš©ν•œλ‹€.

μ‚¬μš© ν•  μ˜΅μ…˜λ¬Έμžλ₯Ό "abc:d" 라고 λ„˜κ²¨μ£Όλ©΄

abdλŠ” μ˜΅μ…˜ 문자만, c은 μ˜΅μ…˜λ¬Έμžμ™€ κ°’(μΆ”κ°€μΈμž)을 같이 λ°›κ³ μž ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

 

이 λ•Œ, μ˜΅μ…˜ c에 κ°’(μΆ”κ°€μΈμž)λ₯Ό 같이 λ°›κ² λ‹€κ³  섀정해두고

μ‹€ν–‰ μ‹œ c에 인자λ₯Ό μ•ˆμ£Όλ©΄? 인자λ₯Ό λͺ»λ°›μ•˜μœΌλ―€λ‘œ.. μž…λ ₯된 μΈμžκ°€ μ˜΅μ…˜μ— μ—†λŠ”κ²ƒμœΌλ‘œ κ°„μ£Όλ˜μ–΄ ? 이 λ°˜ν™˜λœλ‹€.

 

μž…λ ₯을 μ•ˆν–ˆμ„ λ•Œ, ?κ°€ μ•„λ‹Œ μ§€μ •ν•œ 섀정을 μ²˜λ¦¬ν•  수 μžˆλ„λ‘..

음 μ–΄λ–»κ²Œ 보면 default μ˜΅μ…˜μ„ 섀정해쀀닀고도 λ³Ό 수 μžˆμ„ 것 같은데..

μ‚¬μš© ν•  μ˜΅μ…˜λ¬Έμžλ₯Ό μž‘μ„± μ‹œ, 맨 μ•žμ— : λ₯Ό μž‘μ„±ν•΄μ€€λ‹€. ":adn:e" μ΄λŸ°μ‹μœΌλ‘œ..

그러면 μ˜΅μ…˜μ— λŒ€ν•œ κ°’(μΆ”κ°€μΈμž)λ₯Ό 받지 μ•Šμ•˜μ„ 경우 : κ°€ λ°˜ν™˜λœλ‹€.

λ”°λΌμ„œ : μ•ˆμ—μ„œ optoptκ°€ μ–΄λ–€ 값인지λ₯Ό 보고 c값이라면 μ–΄λ– ν•œ 처리λ₯Ό ν•˜λ„λ‘ 지정 ν•  수 μžˆλ‹€.

 

μ΄ν•΄ν•˜κΈ° μœ„ν•œ ν…ŒμŠ€νŠΈ 예제둜 μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•΄λ΄„

μ˜΅μ…˜μœΌλ‘œ -abdλŠ” κ·Έλƒ₯ κ·ΈλŒ€λ‘œ a/b/c 좜λ ₯ 

-cλŠ” μΆ”κ°€μΈμžκΉŒμ§€ λ°›λŠ”κ±Έλ‘œ..

μΆ”κ°€μΈμž λ°›μœΌλ©΄ c μ•ˆλ°›μœΌλ©΄ ccc 좜λ ₯ν•˜λ„λ‘ 함

더보기

참고둜 case ':' μ—μ„œ if(optopt=='a'), 'b', 'd' λŠ” μ˜λ―Έμ—†μŒ

=> getopt()μ—μ„œ ":abc:d" λ₯Ό λ„˜κ²¨μ€¬μŒ. 즉, abdλŠ” μΆ”κ°€μ˜΅μ…˜μ„ μ•ˆλ°›λŠ”κ±°λ‹ˆκΉŒ ! μΆ”κ°€μ˜΅μ…˜μ„ λ„˜κ²¨μ€˜λ„ λ°˜μ‘μ—†μŒ.

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

int main(int argc, char* argv[]) {

    int ch;
    //extern char *optarg;
    extern int optind;

    while ( (ch=getopt(argc, argv, ":abc:d")) != -1) {
        printf("Current Option Number: %d\n", optind);
        printf("argc: %d\n", argc);
        switch(ch) {
            case 'a':
                printf("Option : a\n");
                break;
            case 'b':
                printf("Option : b\n");
                break;
            case 'c':
                printf("Option : c\n");
                //printf("Option arg : optopt");
                break;
            case 'd':
                printf("Option : d\n");
                break;
            case ':':
                if(optopt == 'a') printf("aaa\n");
                if(optopt == 'b') printf("bbb\n");
                if(optopt == 'c') printf("ccc\n");
                if(optopt == 'd') printf("ddd\n");
                break;
            case '?':
                printf("Option Error !! No Option : %c\n", optopt);
                break;
        }
    }
    
    return 0;
}

 

그럼 이제 이걸 ls에 μ μš©ν•΄λ΄μ•Όμ§€........

 

λ°˜μ‘ν˜•

λŒ“κΈ€