通过Golang实现linux命令ls命令(命令行工具构建)
目录
ls 命令os.Args 读取参数pflag小结ls 命令
要实现ls
,首先先我们复习一下ls
命令。
【资料图】
ls
不加任何参数,表示查询当前目录下的文件/文件夹ls
后面加上路径,列出所有,不包含隐藏文件/文件夹ls -a
列出所有,包括以.
开头的隐藏文件
此命令还有很多功能,这一节的重点是命令行程度的编写,就实现上面四个。
os.Args 读取参数
定义如下,一个数组。该数组长度由参数个数决定,第一个参数为程序本身,后面为参数列表。
var Args []string
比如ls -l
,Args=["ls","-l"]
,我们现在实现ls
+目录,或者缺省目录时默认当前目录代码如下。
func main() { targetDirPath := "./" if len(os.Args) > 1 { targetDirPath = os.Args[1] } if dirList, err := ioutil.ReadDir(targetDirPath); err == nil { for _, dirInfo := range dirList { fmt.Print(dirInfo.Name() + " ") } } else { fmt.Println(err.Error()) } }使用
os.Agrs
来获取传入程序的参数使用 ioutil.ReadDir
读取目录,将返回值[] FileInfo
遍历,输出目录/文件信息将遇到的error
输出到 终端
输出
$ go build -o ls main.go
$ ./ls
main.go folder ls
$ ./ls folder
file1 file2
看,我们已经简单的实现了。但我们会发现,要使用-
开头的参数时,用os.Args
这个还需要手写更多复杂逻辑去判断输入的到底是路径,还是其他参数,于是下一个包登场了。
pflag
昨天的每日一Go
已经讲了flag
包,pflag
包与 flag
包的工作原理甚至是代码实现都是类似的,下面是 pflag
相对 flag
的一些优势:
flag
只支持 uint
和 uint64
,而 pflag
额外支持 uint8
、uint16
、int32
等类型。支持更多参数类型:ip
、ip mask
、ip net
、count
、以及所有类型的 slice
类型。兼容标准 flag
库的 Flag
和 FlagSet
:pflag
更像是对 flag
的扩展。原生支持更丰富的功能:支持 shorthand
、deprecated
、hidden
等高级功能。
var a = pflag.BoolP("all", "a", false, "Include directory entries whose names begin with a dot (.).") var help = pflag.BoolP("help", "h", false, "Show this help message.") pflag.Parse() if *help { pflag.Usage() return } args := pflag.Args() if len(args) == 0 { args = append(args, "./") } if len(args) == 1 { ShowPath(args[0], *a) } else { for _, v := range args { fmt.Println(v + ":") ShowPath(v, *a) } }列出文件夹的方式写到了
ShowPath
函数里,第二参数是一个bool
判断是否列出全部文件(包括隐藏文件)感兴趣去看我源代码,这里不是重点。pflag.BoolP
定义一个bool
类型的参数,支持长短参数形式--all
,-a
,返回值是指针。pflag.Parse()
调用这个函数,把参数值设置到相应指针的指向里。pflag.Usage()
用法打印。
这样我们就实现了ls
的基本功能。测试一下。
$ go build -o ls main.go $ ./ls folder go.mod go.sum main.go $ ./ls -a . .. .git folder go.mod go.sum main.go $ ./ls ./ folder ./: folder go.mod go.sum main.go folder: file1 file2 $ ./ls -h Usage of ./ls: -a, --all Include directory entries whose names begin with a dot (.). -h, --help Show this help message.
是不是相当给力啦!
小结
命令行读取一共有五个常用的包
os.Args
系统包提供的参数解析。flag
:简单参数解析,昨天的每日一Go
分享过。pflag
:命令行参数解析。cobra
:应用命令行框架,改天再分享。viper
:配置文件、环境变量、命令行、缓冲区。今天群里的每日一Go已经分享了,就不多说了。
命令行工具,你只要赋予可执行权限,再放到bin
里面,他就会成为一个系统命令,方便你做更多的事情,比如备份数据库之类的动作,提高你的运维效率。 哦对了源码在这:https://github.com/golang-minibear2333/cmd_utils
以上就是通过Golang实现linux命令ls命令(命令行工具构建)的详细内容,更多关于Golang命令行工具的资料请关注脚本之家其它相关文章!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?