(三)命令行选项二
前言
在上一篇中,我们给 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
有问题吗?点此反馈!
温馨提示:反馈需要登录