/* 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μ μ μ©ν΄λ΄μΌμ§........
'μ²μ²ν, κΎΈμ€ν.. > C' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C : touch] CμΈμ΄λ‘ touch ꡬν (0) | 2023.12.18 |
---|---|
[C : ls] Cλ‘ ls ꡬν μ, -a μ΅μ μ²λ¦¬ #getopt (0) | 2023.12.18 |
[C : ls] CμΈμ΄λ‘ ls ꡬννκΈ° #dirent (0) | 2023.12.16 |
[C : ctags] ctags μ€μΉ #universal-ctags (0) | 2023.12.16 |
[C : echo] ν°λ―Έλλ‘ μ λ ₯λ°μ κ° μΆλ ₯νκΈ° #argc #argv (0) | 2023.12.16 |
λκΈ