CLI 命令列實用程式開發基礎

2021-09-27 20:58:34 字數 4016 閱讀 2496

cli(command line inte***ce)實用程式是linux下應用開發的基礎。正確的編寫命令列程式讓應用與作業系統融為一體,通過shell或script使得應用獲得最大的靈活性與開發效率。linux提供了cat、ls、copy等命令與作業系統互動;go語言提供一組實用程式完成從編碼、編譯、庫管理、產品發布全過程支援;容器服務如docker、k8s提供了大量實用程式支撐雲服務的開發、部署、監控、訪問等管理任務;git、npm等都是大家比較熟悉的工具。儘管作業系統與應用系統服務視覺化、圖形化,但在開發領域,cli在程式設計、除錯、運維、管理中提供了圖形化程式不可替代的靈活性與效率。

selpg 程式邏輯

selpg 是從文字輸入選擇頁範圍的實用程式。該輸入可以來自作為最後乙個命令列引數指定的檔案,在沒有給出檔名引數時也可以來自標準輸入。

selpg 首先處理所有的命令列引數。在掃瞄了所有的選項引數(也就是那些以連字元為字首的引數)後,如果 selpg 發現還有乙個引數,則它會接受該引數為輸入檔案的名稱並嘗試開啟它以進行讀取。如果沒有其它引數,則 selpg 假定輸入來自標準輸入。

引數處理

「-snumber」和「-enumber」強制選項:

selpg 要求使用者用兩個命令列引數「-snumber」(例如,「-s10」表示從第 10 頁開始)和「-enumber」(例如,「-e20」表示在第 20 頁結束)指定要抽取的頁面範圍的起始頁和結束頁。這兩個選項,「=snumber」和「-enumber」是強制性的,而且必須是命令列上在命令名 selpg 之後的頭兩個引數:

$ selpg -s10 -e20 ...
「-lnumber」和「-f」可選選項:selpg 可以處理兩種輸入文字:

「-ddestination」可選選項:

selpg 還允許使用者使用「-ddestination」選項將選定的頁直接傳送至印表機。這裡,「destination」應該是 lp 命令「-d」選項(請參閱「man lp」)可接受的列印目的地名稱。

$ selpg -s10 -e20 -dlp1
**實現
//定義儲存引數資料的結構體

type selpgargs struct

//輸入引數使用 github.com/spf13/pflag 包提供的pflag進行處理

func

getargs

(args *selpgargs)

else

}

checkargs函式

//命令列獲取之引數後,先進行引數檢查以避免引數錯誤。

//如果出現錯誤則將問題輸出並正常結束程式。

//如果引數正確則把正確引數值輸出到螢幕上。

func

checkargs

(args *selpgargs)

else

if(args.startpage <=0)

||(args.endpage <=0)

else

if args.startpage > args.endpage

else

if(args.pagetype ==

true)&&

(args.pagelen !=72)

else

if args.pagelen <=

0else

fmt.

printf

("\n[argsstart]\n"

) fmt.

printf

("startpage: %d\nendpage: %d\ninputfile: %s\npagelength: %d\npagetype: %s\nprintdestation: %s\n[argsend]"

, args.startpage, args.endpage, args.infilename, args.pagelen, pagetype, args.printdest)}}

//檢查結束之後,開始呼叫excutecmd函式執行命令。

func

checkerror

(err error

, object string

)}

在excutecmd函式中:

1、檢查輸入。如果沒有給定檔名,則從標準輸入中獲取;如果給出讀取的檔名,則呼叫函式checkfileaccess檢查檔案是否存在。

2、開啟檔案,使用函式checkerror檢查是否出現錯誤。如果開啟出錯則輸出錯誤並丟擲恐慌。

3、判斷是否有-d引數。如果沒有-d引數,選擇的頁直接從os.stdout標準輸出中輸出。如果-d存在,則從指定的列印通道中輸出。

func

excutecmd

(args *selpgargs)

else

iflen

(args.printdest)==0

else

}func

checkfileaccess

(filename string

)}

在-d引數存在時,就需要os/exec包的使用

func

cmdexec

(printdest string

) io.writecloser

最後再使用輸出函式output2des,將輸入的檔案,按頁碼要求讀取並輸出到fout中。

func

output2des

(fout inte***ce

, fin *os.file, pagestart int

, pageend int

, pagelen int

, pagetype bool

)else

}if err == io.eof

checkerror

(err,

"file read in")if

(pagecount >= pagestart)

&&(pagecount <= pageend)

else

if pipeoutput, ok := fout.

(io.writecloser)

; ok

else

checkerror

(outputerr,)}

}if pagecount < pagestart

else

if pagecount < pageend

}

程式測試

按文件 使用 selpg 章節要求測試你的程式

分別使用命令:

CLI 命令列實用程式開發基礎

傳送門,goonline平台 1.概述 cli command line inte ce 實用程式是linux下應用開發的基礎。正確的編寫命令列程式讓應用與作業系統融為一體,通過shell或script使得應用獲得最大的靈活性與開發效率。linux提供了cat ls copy等命令與作業系統互動 g...

CLI命令列實用程式開發基礎

cli 命令列介面 實用程式是linux下應用開發的基礎。正確的編寫命令列程式讓應用與作業系統融為一體,通過shell或指令碼來獲得最大的擴充套件與開發效率。linux提供了cat ls,copy等命令與作業系統互動 go語言提供單個實用程式完成從編碼,編譯,庫管理,產品發布全過程支援 容器服務如d...

CLI 命令列實用程式開發基礎

程式說明 程式測試 go online位址 應該允許輸入來自以下兩種方式 command input file command command input file other command command command command output file command other com...