通過Golang實現linux命令ls命令(命令行工具構建)
ls 命令
要實現ls,首先先我們復習一下ls命令。
ls不加任何參數,表示查詢當前目錄下的文件/文件夾ls后面加上路徑,列出所有,不包含隱藏文件/文件夾ls -a列出所有,包括以.開頭的隱藏文件
此命令還有很多功能,這一節(jié)的重點是命令行程度的編寫,就實現上面四個。
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
看,我們已經簡單的實現了。但我們會發(fā)現,要使用-開頭的參數時,用os.Args這個還需要手寫更多復雜邏輯去判斷輸入的到底是路徑,還是其他參數,于是下一個包登場了。
pflag
昨天的每日一Go已經講了flag包,pflag 包與 flag 包的工作原理甚至是代碼實現都是類似的,下面是 pflag 相對 flag 的一些優(yōu)勢:
- 支持更加精細的參數類型:例如,
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:配置文件、環(huán)境變量、命令行、緩沖區(qū)。今天群里的每日一Go已經分享了,就不多說了。
命令行工具,你只要賦予可執(zhí)行權限,再放到bin里面,他就會成為一個系統命令,方便你做更多的事情,比如備份數據庫之類的動作,提高你的運維效率。 哦對了源碼在這:https://github.com/golang-minibear2333/cmd_utils
以上就是通過Golang實現linux命令ls命令(命令行工具構建)的詳細內容,更多關于Golang命令行工具的資料請關注腳本之家其它相關文章!

