服務計算-goland環境下CLI程式
阿新 • • 發佈:2018-12-17
專案需求
使用 golang 開發 開發 Linux 命令列實用程式 中的 selpg
傳送門:https://github.com/kotomineshiki/CLI
selpg功能
selpg是一個自定義的命令列程式,功能是從原始檔中讀取內容到目標檔案,將包含幾種模式。
說明:-s表示讀入的起始位置,-e表示結束列印的頁碼。每一條命令必須有這兩個引數。
1.
selpg -s1 -e1 [filename]
這個模式是從filename代表的檔案中讀取內容輸出在顯示屏上
2.
selpg -s1 -e1 <[filename]
顯示第一頁的內容
3.
selpg -s1 -e1 [filename1]>[filename2]
把第一個檔案內的字串寫入到第二個檔案中
4.
selpg -s1 -e1 [filename1] 2>[filename2]
如果寫入資訊有錯誤,則把錯誤資訊寫入第二個檔案中
5.
other_command | selpg
other_cammand 的輸出被作為selpg的輸入
pflag包
這是本次作業主要呼叫的api,安裝方法如下
go get github.com/spf13/pflag
然後輸入
go test github.com/spf13/pflag
看到ok後就算安裝完成了
pflag 包的作用是解析輸入的命令
程式設計
結構體
type Args struct {
s int
e int
l int
f bool//按照分頁符\f分頁的識別符號
d string//傳輸目的地
inputFile string//開啟檔案
}
獲取命令列字串並分割成各個引數
func getArgs(args *Args) {//讀取
flag.IntVarP(&args.s, "start", "s", 0 , "start")//-s
flag.IntVarP(&args.e, "end", "e", 0, "end")//-e
flag.IntVarP(&args.l, "line", "l", -1, "line")//
flag.BoolVarP(&args.f, "final", "f", false, "final")
flag.StringVarP(&args.d, "destination", "d", "", "destination")
flag.Parse()
inputFiles := flag.Args()
if len(inputFiles) > 0 {
args.inputFile = inputFiles[0]
} else {
args.inputFile = ""
}
checkArgs(args)//檢驗合法性
}
執行框架-類似於函式的多型性
func executeArgs(args *Args) {
var reader *bufio.Reader
reader = getReader(args)//獲取reader
//get writer
if args.l == -1 {
args.l = 72//預設七十二行
}
if args.d == "" {
writer := bufio.NewWriter(os.Stdout)
if args.f {
readByF(args, reader, writer)
} else {
readByLine(args, reader, writer)//selpg -s1 -e1 filename
}
} else {
var cmd = exec.Command("./" + args.d)//執行子程序
writer, err := cmd.StdinPipe()//通過管道連線子程序
if err != nil {
fmt.Println("Error", err)
os.Exit(1)
}
if err := cmd.Start(); err != nil {
fmt.Println("Error", err)
os.Exit(1)
}
if args.f {
readByFWithDestination(args, reader, writer)//按照分頁符讀取selpg -s1 -e1 -f
} else {
readByLWithDestination(args, reader, writer)//selpg -s1 -e1 -l [process_name]
}
writer.Close()
if err := cmd.Wait(); err != nil {
fmt.Println("Error")
os.Exit(1)
}
}
}