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...