pborman/getopt
GitHub: pborman/getopt
一个为 Go 语言提供传统 getopt 风格命令行选项解析的库,支持标准 BSD 和 GNU getopt_long 语法。
Stars: 130 | Forks: 21
# getopt 
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分析, 日志审计