(三)命令行选项二

Last Modified: 2023/08/13

前言

在上一篇中,我们给 list 命令行程序增加了一个开关选项 -l,今天我们的继续增强 list 命令行,让它能够显示任意目录下的文件而不单单是当前目录。

我通过一个 -d 选项来告诉 list 程序,显示指定目录下的文件。最终,我们的命令行最后可以这样执行:

# 通过“短名”指定目标目录
list -d /some/path
# 或者通过“长名”指定目标目录
list --directory=/some/path

注意,在使用“长选项名称“传递选项值的时候,选项和值之间需要有个 = 号。

定义选项 -d

在 init 方法的最后加入:

rootCmd.Flags().StringP("directory", "d", "", "指定目录路径")

获取选项 -d 的值

在 Run 方法中获取选项 -d 的值,如果值不为空,则显示选型指定的目录下文件名称,否则仍然显示当前目录下的文件名称。

targetDir, _ := cmd.Flags().GetString("directory")
if targetDir == "" {
    wd, _ := os.Getwd()
    targetDir = wd
}

修改 listDirContent

原先的 listDirContent 函数显示当前目录下的文件名称,现在我们将目标目录作为参数传进来。

func listDirContent(sep string, targetDir string) {
	files, _ := ioutil.ReadDir(targetDir)
	fileNames := make([]string, 0, len(files))
	for _, file := range files {
		fileNames = append(fileNames, file.Name())
	}
	fmt.Println(strings.Join(fileNames, sep))
}

最后是完整的实现

Run: func(cmd *cobra.Command, args []string) {
    // 注意:需要通过长名称获取选项的值
    value, _ := cmd.Flags().GetBool("lst")
    targetDir, _ := cmd.Flags().GetString("directory")
    if targetDir == "" {
        wd, _ := os.Getwd()
        targetDir = wd
    }

    sep := " "
    if value {
        sep = "\n"
    }
    listDirContent(sep, targetDir)
},

完整的代码戳这里查看

结语

通过 cobra 来定义选项,获取选项的值很简单,我们完全不用操心如何解析和读取命令行的选项和值。而且最重要的一点,你书写的 list 命令行已经相当专业。

不信?试试运行下面的命令。

# 编译命令行程序
go build
# 查看命令行帮助
./list -h

将会看到相当专业的命令行提示,使用者看到这样的帮助信息,肯定对你刮目相看。

列出指定文件下所有的文件名称,包括文件名和目录名。

Usage:
  list [flags]

Flags:
  -d, --directory string   目标文件夹
  -h, --help               help for list
  -l, --lst                列出文件名,并使用换行符分隔
  -t, --toggle             Help message for toggle
有问题吗?点此反馈!

温馨提示:反馈需要登录