getopt解析

getopt详解

       The  getopt()  function  parses  the  command-line  arguments.  Its arguments argc and argv are the argument count and array as
       passed to the main() function on program invocation.  An element of argv that starts with '-' (and is not exactly "-" or  "--")
       is  an  option  element.   The  characters  of this element (aside from the initial '-') are option characters.  If getopt() is
       called repeatedly, it returns successively each of the option characters from each of the option elements.

       The variable optind is the index of the next element to be processed in argv.  The system initializes this  value  to  1.   The
       caller can reset it to 1 to restart scanning of the same argv, or when scanning a new argument vector.

       If getopt() finds another option character, it returns that character, updating the external variable optind and a static vari‐
       able nextchar so that the next call to getopt() can resume the scan with the following option character or argv-element.

       If there are no more option characters, getopt() returns -1.  Then optind is the index in argv of the first  argv-element  that
       is not an option.

       optstring  is  a  string  containing  the legitimate option characters.  If such a character is followed by a colon, the option
       requires an argument, so getopt() places a pointer to the following text in the same argv-element, or the text of the following
       argv-element,  in optarg.  Two colons mean an option takes an optional arg; if there is text in the current argv-element (i.e.,
       in the same word as the option name itself, for example, "-oarg"), then it is returned in optarg, otherwise optarg  is  set  to
       zero.   This  is  a  GNU extension.  If optstring contains W followed by a semicolon, then -W foo is treated as the long option
       --foo.  (The -W option is reserved by POSIX.2 for implementation extensions.)  This behavior is a GNU extension, not  available
       with libraries before glibc 2.

       By  default,  getopt()  permutes  the  contents of argv as it scans, so that eventually all the nonoptions are at the end.  Two
       other modes are also implemented.  If the first character of optstring is '+' or the environment  variable  POSIXLY_CORRECT  is
       set,  then option processing stops as soon as a nonoption argument is encountered.  If the first character of optstring is '-',
       then each nonoption argv-element is handled as if it were the argument of an option with character code 1.  (This  is  used  by
       programs that were written to expect options and other argv-elements in any order and that care about the ordering of the two.)
       The special argument "--" forces an end of option-scanning regardless of the scanning mode.

       If getopt() does not recognize an option character, it prints an error message to stderr, stores the character in  optopt,  and
       returns '?'.  The calling program may prevent the error message by setting opterr to 0.

       If  getopt()  finds an option character in argv that was not included in optstring, or if it detects a missing option argument,
       it returns '?' and sets the external variable optopt to the actual option character.  If the  first  character  (following  any
       optional  '+'  or  '-'  described  above) of optstring is a colon (':'), then getopt() returns ':' instead of '?' to indicate a
       missing option argument.  If an error was detected, and the first character of optstring is not a colon, and the external vari‐
       able opterr is nonzero (which is the default), getopt() prints an error message.

   getopt_long() and getopt_long_only()
       The getopt_long() function works like getopt() except that it also accepts long options, started with two dashes.  (If the pro‐
       gram accepts only long options, then optstring should be specified as an empty string (""), not NULL.)  Long option  names  may
       be abbreviated if the abbreviation is unique or is an exact match for some defined option.  A long option may take a parameter,
       of the form --arg=param or --arg param.

       longopts is a pointer to the first element of an array of struct option declared in <getopt.h> as

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

       The meanings of the different fields are:

       name   is the name of the long option.

       has_arg
              is: no_argument (or 0) if the option does not take an argument; required_argument (or 1) if the option requires an argu‐
              ment; or optional_argument (or 2) if the option takes an optional argument.

       flag   specifies  how  results are returned for a long option.  If flag is NULL, then getopt_long() returns val.  (For example,
              the calling program may set val to the equivalent short option character.)  Otherwise, getopt_long() returns 0, and flag
              points to a variable which is set to val if the option is found, but left unchanged if the option is not found.

       val    is the value to return, or to load into the variable pointed to by flag.

       The last element of the array has to be filled with zeros.

       If longindex is not NULL, it points to a variable which is set to the index of the long option relative to longopts.

       getopt_long_only()  is  like  getopt_long(), but '-' as well as "--" can indicate a long option.  If an option that starts with
       '-' (not "--") doesn't match a long option, but does match a short option, it is parsed as a short option instead.

RETURN VALUE
       If an option was successfully found, then getopt() returns the option character.  If all command-line options have been parsed,
       then  getopt()  returns  -1.   If  getopt() encounters an option character that was not in optstring, then '?' is returned.  If
       getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring: if it
       is ':', then ':' is returned; otherwise '?' is returned.

       getopt_long()  and  getopt_long_only()  also return the option character when a short option is recognized.  For a long option,
       they return val if flag is NULL, and 0 otherwise.  Error and -1 returns are the same as for getopt(), plus '?' for an ambiguous
       match or an extraneous parameter.

ENVIRONMENT
       POSIXLY_CORRECT
              If this is set, then option processing stops as soon as a nonoption argument is encountered.

       _<PID>_GNU_nonoption_argv_flags_
              This  variable was used by bash(1) 2.0 to communicate to glibc which arguments are the results of wildcard expansion and
              so should not be considered as options.  This behavior was removed in bash(1) version 2.01, but the support  remains  in
              glibc.

CONFORMING TO
       getopt():
              POSIX.2  and  POSIX.1-2001,  provided  the environment variable POSIXLY_CORRECT is set.  Otherwise, the elements of argv
              aren't really const, because we permute them.  We pretend they're const in the prototype to  be  compatible  with  other
              systems.

              The use of '+' and '-' in optstring is a GNU extension.

              On  some older implementations, getopt() was declared in <stdio.h>.  SUSv1 permitted the declaration to appear in either
              <unistd.h> or <stdio.h>.  POSIX.1-2001 marked the use of <stdio.h> for this purpose as LEGACY.   POSIX.1-2001  does  not
              allow the declaration to appear in <stdio.h>.

       getopt_long() and getopt_long_only():
              These functions are GNU extensions.

##简解

这个东西会对argv中的参数进行解析.
首先碰到- 然后对-之后的解析.然后返回-之后的东西. 
如果继续调用,则会返回第二个-之后的东西
//注意:不解析不以-开始的参数,直解析以-开始的参数

在解析,其实上面说的不全对,返回的不一定是-之后的东西,他会判定-之后的东西是否在getopt函数的第三个参数中,如果有,则返回,如果没有,则会打印出invalid option -- 'p' ,然后返回一个 ?
  
第三个参数可以为"?hvVDarsuwAJSF:f:" ,f 和 F 必须要加参数 ,有参数 返回f,无参数返回?
//即如果后面有:,则表示要加参数
另外optind是已经被解析的参数个个数+1,即包括命令
而且getopt之后会对argv里面的参数重新排序



##实验代码
点我下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值