使用golang开发Linux命令行使用程序selpg
文章目录
概述
CLI(Command Line Interface)实用程序是Linux下应用开发的基础。正确的编写命令行程序让应用与操作系统融为一体,通过shell或script使得应用获得最大的灵活性与开发效率。Linux提供了cat、ls、copy等命令与操作系统交互;go语言提供一组实用程序完成从编码、编译、库管理、产品发布全过程支持;容器服务如docker、k8s提供了大量实用程序支撑云服务的开发、部署、监控、访问等管理任务;git、npm等都是大家比较熟悉的工具。尽管操作系统与应用系统服务可视化、图形化,但在开发领域,CLI在编程、调试、运维、管理中提供了图形化程序不可替代的灵活性与效率
原版C语言selpg分析
如何使用
selpg是从文本输入选择页范围的实用程序。该输入可以来自作为最后一个命令行参数指定的文件,在没有给出文件名参数时也可以来自标准输入。selpg 首先处理所有的命令行参数。在扫描了所有的选项参数(也就是那些以连字符为前缀的参数)后,如果 selpg 发现还有一个参数,则它会接受该参数为输入文件的名称并尝试打开它以进行读取。如果没有其它参数,则 selpg 假定输入来自标准输入。
在命令行中输入的指令为如下形式,:
selpg -sstart_page -eend_page [-lline | -f ] [-d dstFile] filename
我们来看每个参数的含义。
首先是两个必选参数:
- -sstartPage:例如
-s10
,表示从第10页开始打印。 - -eendPage:例如
-e50
,表示打印到50页。
selpg -s10 -e50 ..
然后是可选参数:
- -llinePerPage :例如
-l72
,表示每一页72行,即将输入文件按72行一页分割,默认为72。 - -f :按照换页符来打印,默认一行一页。
- -ddstFile:输出文件路径,默认为标准输出,即命令行界面。
如果在检查完上面的参数后发现还有一个参数,即filename,则将其设置为输入文件,否则等待标准输入即命令行输入文件路径。
一些例子:
selpg -s1 -e1 input_file
将input_file的第1页打印到屏幕。
selpg -s10 -e20 input_file >output_file
将input_file的第10页到第20页打印output_file。
源代码分析
首先定义了一个结构体selpg_args,包含了所有参数。
struct selpg_args
{
int start_page;
int end_page;
char in_filename[BUFSIZ];
int page_len; /* default value, can be overriden by "-l number" on command line */
int page_type; /* 'l' for lines-delimited, 'f' for form-feed-delimited */
/* default is 'l' */
char print_dest[BUFSIZ];
};
process_args函数解析用户的输入,将对应的参数放入参数结构体sa中。以空格分隔的字符串前带有连字符作为标志判断参数,最后如果还有一个参数的话将其设为输入文件,并且检查所有的输入是否符合要求打印错误信息。
process_input函数负责根据sa的属性设定输入输出源,设置每页的行数并开始打印。
usage函数用于打印帮助信息。
那么我们这次的任务,就是将c语言程序“翻译”成go语言程序。
golang实现selpg
-
首先是selpgArgs结构体,比较简单
type selpgArgs struct { startPage int endPage int inputFile string pageLen int pageType bool printDest string }
-
ProcessArgs函数:
func ProcessArgs(parg *selpgArgs) { /*参数个数必须大于等于3*/ if len(os.Args) < 3 { fmt.Fprintf(os.Stderr, "%s: not enough arguments\n", progname) Usage(); os.Exit(1) } /*第一个参数必须是-s*/ tmp := os.Args[1] if tmp[0:2] != "-s" { fmt.Fprintf(os.Stderr, "%s: 1st arg should be -sstart_page\n"