基于本人对多种编程语言的粗浅了解,不论是哪种编程语言它的参数传递方式主要分为下面两类:
- 直接传递(以Perl为例进行说明)
在调用脚本时,直接传递参数,如:
./script.pl a b c
然后在脚本中用
@ARGV
变量获取这些参数
- getopt方法
这种方法是大多数专业程序中都会用到的方法,使用的时候在参数名前加连接符,后面接上参数的实际赋值,例如:
-a 1
不过getopt方法的参数解析方式略显复杂,下面会在具体的语言中进行逐一说明
直接传递的传参方式的优点是编写和使用起来很方便,但缺点很明显,参数的顺序是固定的,不能随意改变,每回使用时都需要确定各个参数分别是什么,而且一般采用这种传参方式的人是不会编写帮助文档的,所以一旦忘了只能查看源代码
getopt方法的优点是,传参方式灵活,而且采用这种传参方式的程序员一般都会在程序中添加帮助文档,因此这种传参方式对用户是非常友好的,但是对于程序员来说,则意味着他或她不得不多写好几行代码——所以一个好的程序员头顶凉凉是可以理解的~
以下我们只介绍第二种传参方法
Perl
Perl中getopt传参
Perl中的这个功能需要通过调用Getopt::Long
模块实现
1 | use Getopt::Long; |
然后使用GetOptions函数承接传递的参数:
1 | my ($var1,$var2,$var3,$var4); # 若使用"use strict"模式,则需要提前定义变量 |
这样,你就可以通过以下的方式进行灵活的Perl脚本参数传递了:
1 | $ perl perlscript.pl -i var1 -o var2 ... |
Perl中输出帮助文档
可以使用POD文档实现在Perl中输出帮助文档,想了解更多关于POD文档的知识,请点 这里
1 | =head1 part1 |
注意:每个=标签上下必须隔一行,否则就会错误解析。
用pod2doc $0
可以将程序中的文档打印出来,不过一般用在程序内部,当程序参数设定错误时打印pod文档:
1 | die `pod2doc $0` if (...); |
实现实例
1 | #!/usr/bin/perl |
Shell
Shell中的getopt传参
Shell中的这个功能可以通过getopts函数实现
1 | getopts [option[:]] [DESCPRITION] VARIABLE |
option
:表示为某个脚本可以使用的选项
":"
:如果某个选项(option)后面出现了冒号(”:”),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE
:表示将某个选项保存在变量VARIABLE中
1 | while getopts ":a:b:c:" opt |
Shell中输出帮助文档
在Shell中编辑一个helpdoc( )
的函数即可实现输出帮助文档
1 | helpdoc(){ |
将你想要打印出来的帮助信息写在cat <<EOF
和EOF
之间
之所以使用EOF
来编写是因为,只是一种所见即所得的文本编辑形式(这个不好解释,请自行百度)
当你要打印帮助文档时,直接调用执行helpdoc( )
函数即可
1 | # 当没有指定参数时,即参数个数为0时,输出帮助文档并退出程序执行 |
实现实例
1 | helpdoc(){ |
Python
Python中的getopt传参
Python中的这种功能需要通过getopt
模块实现
1 | import getopt |
Python脚本获得成对的参数名和参数值后,会分别把它们保存在一个字典变量中,参数名为key,参数值为value
1 | opts,args = getopt.getopt(argv,"hi:o:t:n:",["ifile=","ofile=","time="]) |
getopt函数的使用说明:
argv
:使用argv
过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)
"hi:o:t:n:"
:使用短格式分析串,当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个”:” 号
["ifile=","ofile=","time="]
: 使用长格式分析串列表,长格式串也可以有开关状态,即后面不跟”=” 号。如果跟一个等号则表示后面还应有一个参数
然后通过条件判断的方法对参数进行解析:
1 | for opt,arg in opts: |
Python中的argparse传参
该示例例来自黄树嘉大佬的github项目 cmdbtools
1 | import argparse # 导入命令行解析的库文件 |
输出的主命令的帮助文档如下:
1 | $ cmdbtools --help |
下面换一种思路来学习argparse
:给出要实现的帮助文档,如何通过编写代码实现
帮助文档以上面的为例:
<img src=./picture/Helpdoc-in-Perl-Shell-and-Python.png />
上面用红色框将帮助文档的内容分成了三个在实现过程中相对独立的部分
(1)脚本基本语法和描述信息
在创建好argparse
对象之后,就设定好了这一部分的信息
1 | argparser = argparse.AugumentParser(description='Manage authentication for CMDB API and do querying from command line.') |
描述信息在description
参数中添加
从脚本基本语法可以看出:
1 | usage: cmdbtools [-h] |
在主程序的parser下方还创建了附属的子parser,可以通过argparser.add_subparsers
创建附属的子parsers对象(例子中将子parsers对象命名为commands):
1 | commands = argparser.add_subparsers(dest='command', title='Commands') |
创建好子parsers对象之后,还需要创建其下所附属的具体的每一个子parser,使用command.add_parser
:
1 | login_command = commands.add_parser('login', help='Authorize access to CMDB API.') |
(2)默认的可选参数-h/--help
这个默认的可选参数不需要单独创建,在创建argparse
对象后就会默认内置了
(3)添加具体的参数
例如,子parser login
下的帮助文档:
1 | usage: cmdbtools login [-h] -k TOKEN |
则可以通过下面的代码添加对应的参数解析:
1 | login_command.add_argument('-k', '--token', type=str, required=true, dest='token', help='CMDB API access key(Token).') |
Python中输出帮助文档
在Python中创建一个字符串变量helpdoc
即可实现输出帮助文档
1 | helpdoc = ''' |
在需要时将这个变量打印出来即可:
1 | try: |
实现实例
1 | import getopt |
参考资料:
(2) 本人github笔记:实用小脚本