<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
要實現ls
,首先先我們複習一下ls
命令。
ls
不加任何引數,表示查詢當前目錄下的檔案/資料夾ls
後面加上路徑,列出所有,不包含隱藏檔案/資料夾ls -a
列出所有,包括以.
開頭的隱藏檔案此命令還有很多功能,這一節的重點是命令列程度的編寫,就實現上面四個。
定義如下,一個陣列。該陣列長度由引數個數決定,第一個引數為程式本身,後面為參數列。
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
這個還需要手寫更多複雜邏輯去判斷輸入的到底是路徑,還是其他引數,於是下一個包登場了。
昨天的每日一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命令列工具的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45