当前位置:  开发笔记 > 编程语言 > 正文

将命令行字符串解析为Golang中的标志和参数

如何解决《将命令行字符串解析为Golang中的标志和参数》经验,为你挑选了1个好方法。

我正在寻找一个包含一个字符串的包,并将其-v --format "some example" -i test解析为一段字符串,正确处理引号,空格等:

-v
--format
some example
-i
test

我已经检查了内置flag包以及Github上的其他标志处理包,但它们似乎都没有处理将原始字符串解析为令牌的特殊情况.在尝试自己做之前,我宁愿寻找一个包,因为我确信有很多特殊情况需要处理.

有什么建议吗?



1> laurent..:

有关信息,这是我最终创建的功能。

它将命令拆分为其参数。例如cat -v "some file.txt",将返回["cat", "-v", "some file.txt"]

它还可以正确处理转义字符,尤其是空格。因此cat -v some\ file.txt也将正确地分为["cat", "-v", "some file.txt"]

func parseCommandLine(command string) ([]string, error) {
    var args []string
    state := "start"
    current := ""
    quote := "\""
    escapeNext := true
    for i := 0; i < len(command); i++ {
        c := command[i]

        if state == "quotes" {
            if string(c) != quote {
                current += string(c)
            } else {
                args = append(args, current)
                current = ""
                state = "start"
            }
            continue
        }

        if (escapeNext) {
            current += string(c)
            escapeNext = false
            continue
        }

        if (c == '\\') {
            escapeNext = true
            continue
        }

        if c == '"' || c == '\'' {
            state = "quotes"
            quote = string(c)
            continue
        }

        if state == "arg" {
            if c == ' ' || c == '\t' {
                args = append(args, current)
                current = ""
                state = "start"
            } else {
                current += string(c)
            }
            continue
        }

        if c != ' ' && c != '\t' {
            state = "arg"
            current += string(c)
        }
    }

    if state == "quotes" {
        return []string{}, errors.New(fmt.Sprintf("Unclosed quote in command line: %s", command))
    }

    if current != "" {
        args = append(args, current)
    }

    return args, nil
}

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有