服务计算第四周作业:开发简单CLI程序

使用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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值