【问题标题】:Bash getopts command in GolangGolang 中的 Bash getopts 命令
【发布时间】:2021-07-15 22:10:14
【问题描述】:

如何在 Golang 中将列表作为标志变量传递?例如,在 Bash 中,您可以将列表作为 getopts 传递给脚本。类似的东西:

./myScript.sh -n list_of_names.txt  //some file with about 50 names

然后循环遍历列表:

#!/bin/bash

while getopts "n:h:" options; do
  case "${options}" in
    "n") NAME=${OPTARG};;
    "h") PRINT_USAGE;;
  esac
done
for i in $NAME; do
  //TODO

我听说过“flag”包,但我不知道如何实现它

PS 我是 Go 新手

【问题讨论】:

  • 这是来自文档的入门示例:golang.org/pkg/flag/#example_
  • flag 用于接收参数,而不是将它们发送到另一个命令。 POSIX 没有“列表”参数的概念——所有 CLI 参数都是简单的字符串。这里没有显示 Go 代码;你能详细说明你正在尝试做什么并展示你是如何尝试做的吗?
  • 我还没有,但我需要在稍后阶段遍历传递的列表。抱歉,也许我的表述有点误导。我想要实现的结果与使用 bash 脚本的结果基本相同,但在 Golang 中
  • @Stead 你问如何遍历命令行参数指定的文件中的行?
  • 你似乎很困惑。您没有将“列表”指定为参数,而是指定了文件名。你的程序对这个文件名做什么是一个完全独立的问题。例如,如何逐行读取文件已在 SO 和其他地方得到解答。

标签: go command-line-arguments getopts


【解决方案1】:

在您的示例中,您实际上只有一个必需的参数,因此您实际上不需要解析任何内容。您可以检查切片长度:

package main
import "os"

func main() {
   if len(os.Args) != 2 {
      println("myScript <file>")
      os.Exit(1)
   }
   name := os.Args[1]
   println(name)
}

https://golang.org/pkg/os#Args

【讨论】:

  • 在上面的例子中是的,但这只是为了概述我需要在 Go 中实现的目标。基本上我不能像那样传递整个 bash 脚本,我只能使用变量作为标志,而其中一个变量恰好是服务器列表,我需要对其进行迭代。不幸的是,我没有任何 Go 代码可以与您分享:(
  • @Stead 如果您想要一个好的答案,您需要发布一个好问题。提供一个实际需要flag包的例子,然后告诉我