项目需求
使用 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)
}
}
}