pborman/getopt

GitHub: pborman/getopt

一个为 Go 语言提供传统 getopt 风格命令行选项解析的库,支持标准 BSD 和 GNU getopt_long 语法。

Stars: 130 | Forks: 21

# getopt ![build status](https://travis-ci.org/pborman/getopt.svg?branch=master) Package getopt 提供了传统的 getopt 处理功能,用于实现使用传统命令行的命令。例如,标准的 Go flag 包无法用来编写像 ls 或 ssh 那样解析标志的程序。目前有两个版本,v1 和 v2,都命名为 getopt,它们使用以下导入路径: ``` "github.com/pborman/getopt" // version 1 "github.com/pborman/getopt/v2" // version 2 ``` 本 README 描述了该包的版本 2,它具有更简化的 API。 ## 用法 Getopt 支持标准 BSD getopt 以及(众多版本之一的)GNU getopt_long 中的功能。作为一个 Go 包,这个包让常见的用法变得简单,但在需要时仍然支持更受控的用法。 典型用法: ``` Declare flags and have getopt return pointers to the values. helpFlag := getopt.Bool('?', "display help") cmdFlag := getopt.StringLong("command", 'c', "default", "the command") Declare flags against existing variables. var ( fileName = "/the/default/path" timeout = time.Second * 5 verbose bool ) func init() { getopt.Flag(&verbose, 'v', "be verbose") getopt.FlagLong(&fileName, "path", 0, "the path") getopt.FlagLong(&timeout, "timeout", 't', "some timeout") } func main() { Parse the program arguments getopt.Parse() Get the remaining positional parameters args := getopt.Args() ... ``` 如果你不想让程序在出错时退出,请使用 getopt.Getopt: ``` err := getopt.Getopt(nil) if err != nil { code to handle error fmt.Fprintln(os.Stderr, err) } ``` ## 标志语法 如果不声明长名称,这个包将像传统的 BSD getopt 那样处理参数。 短标志可以组合成一个单一参数。例如,"-a -b -c" 也可以表示为 "-abc"。长标志必须独立存在 "--alpha --beta" 带值选项需要一个参数。对于短选项,参数可以紧跟在短名称之后,也可以作为下一个参数。在一个单一参数中,只能有一个短值选项与短标志组合;该短值选项必须位于所有短标志之后。例如,如果 f 是一个标志,v 是一个值,那么: ``` -vvalue (sets v to "value") -v value (sets v to "value") -fvvalue (sets f, and sets v to "value") -fv value (sets f, and sets v to "value") -vf value (set v to "f" and value is the first parameter) ``` 对于长值选项 val: ``` --val value (sets val to "value") --val=value (sets val to "value") --valvalue (invalid option "valvalue") ``` 带有可选值的选项只有在值是同一参数的一部分时才会设置该值。无论哪种情况,选项计数都会增加,并且该选项会被标记为已出现。 ``` -v -f (sets v and f as being seen) -vvalue -f (sets v to "value" and sets f) --val -f (sets v and f as being seen) --val=value -f (sets v to "value" and sets f) ``` 没有定义用于将值设为可选的便捷函数。必须在实际的 Option 上调用 SetOptional 方法。 ``` v := String("val", 'v', "", "the optional v") Lookup("v").SetOptional() var s string FlagLong(&s, "val", 'v', "the optional v).SetOptional() ``` 解析会一直持续,直到遇到第一个非选项或 "--" 为止。 短名称 "-" 可以被使用,但它要么被指定为 "-",要么作为一组选项的一部分,例如 "-f-"。如果没有指定长选项,那么也可以使用 "--f"。如果 "-" 没有被声明为选项,那么单一的 "-" 也会终止选项处理,但与 "--" 不同的是,"-" 会成为剩余参数的一部分。 ## 高级用法 通常,解析是通过调用 Parse 函数来执行的。如果查看选项的顺序很重要,则应使用 Getopt 函数。标准的 Parse 函数执行的操作等同于: ``` func Parse() { if err := getopt.Getopt(os.Args, nil); err != nil { fmt.Fprintln(os.Stderr, err) s.usage() os.Exit(1) } } ``` 当调用 Getopt 时,打印任何错误是调用者的责任。 通常使用默认的选项集 CommandLine。可以使用 New 创建其他选项集。 解析后,该集合的 Args 将包含非选项参数。如果遇到错误,Args 将以导致错误的参数开头。 可以第二次调用集合的 Parse 来修改当前的标志或值集合。例如: ``` var a = getopt.Bool('a', "", "The a flag") var b = getopt.Bool('b', "", "The a flag") var cmd = "" var opts = getopt.CommandLine opts.Parse(os.Args) if opts.NArgs() > 0 { cmd = opts.Arg(0) opts.Parse(opts.Args()) } ``` 如果调用时 set 为 { "prog", "-a", "cmd", "-b", "arg" },那么 a 和 b 都会被设置,cmd 会被设置为 "cmd",并且 opts.Args() 将返回 { "arg" }。 除非选项类型明确禁止,否则一个选项可以在参数中出现多次。提供给该选项的最后一个值即为最终值。 ## 内置类型 还有一些辅助例程允许单行声明标志。这些类型包括:Bool、Counter、Duration、Enum、Int16、Int32、Int64、Int、List、Signed、String、Uint16、Uint32、Uint64、Uint 和 Unsigned。 每种都有短和长两种形式,例如 Bool 和 BoolLong,并包含用于在标准命令行或特定标志 Set 上设置标志的函数。 除了 Counter、Enum、Signed 和 Unsigned 类型外,所有这些类型都可以通过向 Flag 和 FlagLong 传递指向相应类型的指针来声明。 ## 声明新的标志类型 任何实现了 Value 接口的类型的指针都可以传递给 Flag 或 FlagLong。 ## VALUEHELP 所有非标志选项都使用 "valuehelp" 作为最后一个参数来创建。 Valuehelp 应该是 0、1 或 2 个字符串。第一个字符串(如果提供)是该选项的用法说明。第二个字符串(如果提供)是显示用法时用于该值的名称。如果未提供,则假定为 "value" 一词。 使用以下方式创建的选项 ``` StringLong("option", 'o', "defval", "a string of letters") ``` 其用法说明为 ``` -o, -option=value ``` 而使用以下方式创建的选项 ``` StringLong("option", 'o', "defval", "a string of letters", "string") ``` 其用法说明为 ``` -o, -option=string ```
标签:EVTX分析, 日志审计