CLI 命令行实用程序开发基础
1、selpg简介
1.1 程序说明
selpg是一个命令行工具,全称是Select Pages,它允许用户从输入文本中抽取指定的页的范围,然后按行数或按分页符输出这些页,同时该命令还允许用户指定标准输出的位置。
selpg可以有选择性的查看或打印某个文档的部分内容,简单、高效、节约资源。
1.2 文件内容
文件名 | 作用 |
---|---|
selpg.go | 核心文件,selpg功能的实现代码 |
test | 测试文件,有1001行数据,用于测试selpg的功能 |
output | 可选的输出文件,用于测试selpg的输出重定向 |
error | 可选的错误输出文件,用于测试selpg的错误输出重定向 |
1.3 输入样例
go run selpg.go -s num1 -e num2 [-f / -l page_len] [-d str] input_file
1.4 参数格式
参数 | 值类型 | 必选/可选 | 功能 |
---|---|---|---|
-s | int | 必选 | 指定起始页码,默认为-1 |
-e | int | 必选 | 指定结束页码,默认为-1 |
input_file | string | 可选 | 指定输入文件,默认为空 |
-f | bool | 可选 | 指定解读模式为以分页符分页,不可与-l同时使用 |
-l | int | 可选 | 指定每页的行数,默认为每页72行 |
-d | string | 可选 | 指定打印机设备地址 |
2、selpg实现
具体的selpg实现是参照老师所给出的 开发 Linux 命令行实用程序 中的selpg的C语言实现版本 selpg.c 以及 标准库—命令行参数解析FLAG 中用flag编写命令行实用程序的例子。
实际上就是参照yonggo语言编写nginx的例子,将selpg.c翻译成go语言版本的selpg.go 。
2.1 参数结构体
为了方便对多个参数的管理,先定义一个用于接收参数的结构体。
此结构体具体有起始页码、结束页码、输入文件、页长度、页分隔类型、打印机地址等。
type Selpg struct{
start_page int //起始页数,从0开始计数
end_page int //终止页数
in_filename string //输入文件
page_len int //每页输出的长度(即行数,当以-f打印时此值设定为-1
page_type bool //打印文件的类型,其中true代表按分页符打印-f,false代表按行打印-l
destination string //输出终端
}
2.2 参数输入
这里主要是用flag包来做参数解析,用flag.XxxVar()来根据参数的参数类型来将值与具体参数绑定,还可以设置默认值和输入提示。
根据参照文件的内容,这里将-s -e -l -f -d的值直接绑定到变量。
特别的,要注意此处-l的默认值,如果直接设置成72,后面则没法判断-f和-l冲突与否的情况,一旦输入有-f就会显示-f与-l冲突。因此这里先将默认值改成-1,在后面若是没有用到-f模式则默认为要-l模式,再设为72。
flag.Usage = usage
flag.IntVar(&(selpg.start_page), "s", -1, "Start page")
flag.IntVar(&(selpg.end_page), "e", -1, "End page")
flag.IntVar(&(selpg.page_len), "l", -1, "Line per page")
flag.BoolVar(&(selpg.page_type), "f", false, " Page type")
flag.StringVar(&(selpg.destination), "d", "", "Print destination")
flag.Parse()
2.3 参数检查
这里检查了6个可以在运行前判断错误的情况:
- 未设定起止页码
- 起止页码命令输入错误
- 起止页码过小
- 起止页码过大,溢出了
- 起始页码大于结束页码
- -l和-f冲突
func process_args(selpg *Selpg) {
//未设定起止页码
if selpg.start_page==-1 || selpg.end_page==-1{
fmt.Fpri