CLI 命令行实用程序开发基础
概述
CLI(Command Line Interface)实用程序是Linux下应用开发的基础。正确的编写命令行程序让应用与操作系统融为一体,通过shell或script使得应用获得最大的灵活性与开发效率。Linux提供了cat、ls、copy等命令与操作系统交互;go语言提供一组实用程序完成从编码、编译、库管理、产品发布全过程支持;容器服务如docker、k8s提供了大量实用程序支撑云服务的开发、部署、监控、访问等管理任务;git、npm等都是大家比较熟悉的工具。尽管操作系统与应用系统服务可视化、图形化,但在开发领域,CLI在编程、调试、运维、管理中提供了图形化程序不可替代的灵活性与效率。
开发实践
selpg程序逻辑
使用 golang 开发 开发Linux命令行实用程序中的 selpg。selpg 是从文本输入选择页范围的实用程序。该输入可以来自作为最后一个命令行参数指定的文件,在没有给出文件名参数时也可以来自标准输入。
参数处理
强制选项:“-sNumber”和“-eNumber”
selpg 要求用户用两个命令行参数“-sNumber”(例如,“-s10”表示从第 10 页开始)和“-eNumber”(例如,“-e20”表示在第 20 页结束)指定要抽取的页面范围的起始页和结束页。
$ selpg -s10 -e20 ...
可选选项:“-lNumber”和“-f”
selpg 可以处理两种输入文本:
- 文本的页行数固定。这是缺省类型,如果既没有给出“-lNumber”也没有给出“-f”选项,则 selpg 会理解为页有固定的长度(在我的程序中默认每页 20 行)。
该缺省值可以用“-lNumber”选项覆盖,如下所示:
$ selpg -s10 -e20 -l66 ...
- 该类型文本的页由 ASCII 换页字符(十进制数值为 12,在 C 中用“\f”表示)定界。在含有文本的行后面,只需要一个字符 ― 换页 ― 就可以表示该页的结束。
$ selpg -s10 -e20 -f ...
注:“-lNumber”和“-f”选项是互斥的。
可选选项:“-dDestination”
selpg 还允许用户使用“-dDestination”选项将选定的页直接发送至打印机。
$ selpg -s10 -e20 -dlp1
程序实现
1.设置程序的参数结构体。提取参数将值赋值给该结构体
//selpg的参数
type selpg_args struct {
start_page int //开始页
end_page int //结束页
in_filename string //作为输入的文件名
dest string //输出
page_len int //一页的长度
page_type int //划分页方式
}
var sa selpg_args //当前输入的参数
var progname string //程序名
var argcount int //参数个数
2.读取各个参数。使用os.Args
读取程序输入的所有参数,得到的值是包含参数的string数组。判断每个参数的格式是否正确,参数个数是否正确以及将参数的值提取出来赋值给结构体
func process_args(args []string) {
//参数数量不够
if len(args) < 3 {
fmt.Fprintf(os.Stderr, "%s: not enough arguments\n", progname)
Usage()
os.Exit(1)
}
//处理第一个参数
if args[1][0] != '-' || args[1][2] != 's' {
fmt.Fprintf(os.Stderr, "%s: 1st arg should be -sstart_page\n", progname)
Usage()
os.Exit(1)
}
//提取开始页数
sp, _ := strconv.Atoi(args[1][2:])
if sp < 1 {
fmt.Fprintf(os.Stderr, "%s: invalid start page %d\n", progname, sp)
Usage()
os.Exit(1)
}
sa.start_page = sp
//处理第二个参数
if args