1. 程式人生 > >服務計算-goland環境下CLI程式

服務計算-goland環境下CLI程式

專案需求

​使用 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)
      }
   }
}

程式測試在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述