Как перебрать аргументы командной строки и собрать то, что осталось после флагов? - PullRequest
0 голосов
/ 06 ноября 2019

Моя цель - "init", "init -site = test", обе версии init, а также отдельная команда "debug", которые будут приняты в командной строке, и обрабатывать все, что осталось как имя файла.

На самом деле происходит то, что в случае "init -site = test" по какой-то причине "-site = test" также принимается в качестве имени файла. Как я могу остановить это?

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    initCmd := flag.NewFlagSet("init", flag.ExitOnError)
    initSiteName := initCmd.String("site", "", "Main name for your site")
    flag.Parse()
    for pos, cmd := range os.Args {
        switch cmd {
        case "debug":
            fmt.Printf("debug\n")
        case "init":
            initCmd.Parse(os.Args[pos+1:])
            fmt.Printf("init\n  site name:%v\n", *initSiteName)
        default:
            fmt.Printf("Filename: %v\n", cmd);
        }
    }
}

1 Ответ

3 голосов
/ 06 ноября 2019

Не очень удобно использовать пакет flag. Начиная с doc :

Разбор флага останавливается непосредственно перед первым аргументом без флага («-» является аргументом без флага) или после терминатора «-».

Вы должны будете сделать это вручную:

После синтаксического анализа аргументы, следующие за флагами, доступны как флаг среза. Args () или отдельно как flag.Arg. (i).

Или вы можете использовать другой пакет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...