本文同步发表于简书平台中

基于本人对多种编程语言的粗浅了解,不论是哪种编程语言它的参数传递方式主要分为下面两类:直接传递(以Perl为例进行说明)

在调用脚本时,直接传递参数,如:./script.pl a b c

然后在脚本中用@ARGV变量获取这些参数getopt方法

这种方法是大多数专业程序中都会用到的方法,使用的时候在参数名前加连接符,后面接上参数的实际赋值,例如:-a 1

不过getopt方法的参数解析方式略显复杂,下面会在具体的语言中进行逐一说明

直接传递的传参方式的优点是编写和使用起来很方便,但缺点很明显,参数的顺序是固定的,不能随意改变,每回使用时都需要确定各个参数分别是什么,而且一般采用这种传参方式的人是不会编写帮助文档的,所以一旦忘了只能查看源代码

getopt方法的优点是,传参方式灵活,而且采用这种传参方式的程序员一般都会在程序中添加帮助文档,因此这种传参方式对用户是非常友好的,但是对于程序员来说,则意味着他或她不得不多写好几行代码——所以一个好的程序员头顶凉凉是可以理解的~

以下我们只介绍第二种传参方法

1. Perl

1.1. Perl中getopt传参

Perl中的这个功能需要通过调用Getopt::Long模块实现

use Getopt::Long;

然后使用GetOptions函数承接传递的参数:

my ($var1,$var2,$var3,$var4); # 若使用"use strict"模式,则需要提前定义变量

GetOptions(

"i:s"=>\$var1,

"o:s"=>\$var2,

"n:i"=>\$var3,

"m:i"=>\$var4

);

这样,你就可以通过以下的方式进行灵活的Perl脚本参数传递了:

$ perl perlscript.pl -i var1 -o var2 ...

1.2. Perl中输出帮助文档

可以使用POD文档实现在Perl中输出帮助文档,想了解更多关于POD文档的知识,请点 这里

=head1 part1

doc in part1

=head2 part2

doc in part2

.

.

.

=cut # pod文档结束的标志

注意:每个=标签上下必须隔一行,否则就会错误解析。

用pod2doc $0可以将程序中的文档打印出来,不过一般用在程序内部,当程序参数设定错误时打印pod文档:

die `pod2doc $0` if (...);

1.3. 实现实例

#!/usr/bin/perl

use strict;

use warnings;

use Getopt::Long;

use POSIX;

# 帮助文档

=head1 Description

This script is used to split fasta file, which is too large with thosands of sequence

=head1 Usage

$0 -i -o [-n ] [-m ]

=head1 Parameters

-i [str] Input raw fasta file

-o [str] Output file to which directory

-n [int] Sequence number per file, alternate chose paramerter "-n" or "-m", if set "-n" and "-m" at the same time, only take "-n" parameter

-m [int] Output file number (default:100)

=cut

my ($input,$output_dir,$seq_num,$file_num);

GetOptions(

"i:s"=>\$input,

"o:s"=>\$output_dir,

"n:i"=>\$seq_num,

"m:i"=>\$file_num

);

die `pod2text $0` if ((!$input) or (!$output_dir));

.

.

.

2. Shell

2.1. Shell中的getopt传参

Shell中的这个功能可以通过getopts函数实现

getopts [option[:]] [DESCPRITION] VARIABLEoption:表示为某个脚本可以使用的选项

":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)

VARIABLE:表示将某个选项保存在变量VARIABLE中

while getopts ":a:b:c:" opt

do

case $opt in

a)

echo "参数a的值$OPTARG"

;;

b)

echo "参数b的值$OPTARG"

;;

c)

echo "参数c的值$OPTARG"

;;

?)

echo "未知参数"

exit 1;;

esac

done

2.2. Shell中输出帮助文档

在Shell中编辑一个helpdoc( )的函数即可实现输出帮助文档

helpdoc(){

cat <

Description:

.

.

.

Usage:

$0 -a -b -c ...

Option:

.

.

.

EOF

}

将你想要打印出来的帮助信息写在cat <

之所以使用EOF来编写是因为,这是一种所见即所得的文本编辑形式(这个不好解释,请自行百度)

当你要打印帮助文档时,直接调用执行helpdoc( )函数即可

# 当没有指定参数时,即参数个数为0时,输出帮助文档并退出程序执行

if [ $# = 0 ]

then

helpdoc()

exit 1

fi

2.3. 实现实例

helpdoc(){

cat <

Description:

This shellscript is used to run the pipeline to call snp using GATK4

- Data merge: merge multi-BAM files coresponding to specified strain

- Data pre-processing: Mark Duplicates + Base (Quality Score) Recalibration

- Call variants per-sample

- Filter Variants: hard-filtering

Usage:

$0 -S -R -k -i

Option:

-S strain name, if exist character "/", place "/" with "_" (Required)

-R the path of bwa index (Required)

-k known-sites variants VCF file

-i intervals list file,must be sorted (Required)

EOF

}

workdir="/work_dir"

# 若无指定任何参数则输出帮助文档

if [ $# = 0 ]

then

helpdoc

exit 1

fi

while getopts "hS:k:R:i:" opt

do

case $opt in

h)

helpdoc

exit 0

;;

S)

strain=$OPTARG

# 检测输入的strain名是否合格:是否含有非法字符"/"

if [[ $strain =~ "/" ]]

then

echo "Error in specifing strain name, if exist character \"/\", place \"/\" with \"_\""

helpdoc

exit 1

fi

if [ ! -d $workdir/SAM/$strain ]

then

echo "There is no such folder coresponding to $strain"

helpdoc

exit 1

fi

;;

R)

index=$OPTARG

;;

k)

vcf=$OPTARG

if [ ! -f $vcf ]

then

echo "No such file: $vcf"

helpdoc

exit 1

fi

;;

i)

intervals=$OPTARG

if [ ! -f $bed ]

then

echo "No such file: $intervals"

helpdoc

exit 1

fi

;;

?)

echo "Unknown option: $opt"

helpdoc

exit 1

;;

esac

done

.

.

.

3. Python

3.1. Python中的getopt传参

Python中的这种功能需要通过getopt模块实现

import getopt

Python脚本获得成对的参数名和参数值后,会分别把它们保存在一个字典变量中,参数名为key,参数值为value

opts,args = getopt.getopt(argv,"hi:o:t:n:",["ifile=","ofile=","time="])

getopt函数的使用说明:argv:使用argv过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)

"hi:o:t:n:":使用短格式分析串,当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号

["ifile=","ofile=","time="]: 使用长格式分析串列表,长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数

然后通过条件判断的方法对参数进行解析:

for opt,arg in opts:

if opt in ("-h","--help"):

print(helpdoc)

sys.exit()

elif opt in ("-i","--ifile"):

infile = arg

elif opt in ("-t","--time"):

sleep_time = int(arg)

.

.

.

3.2. Python中输出帮助文档

在Python中创建一个字符串变量helpdoc即可实现输出帮助文档

helpdoc = '''

Description

...

Usage

python pyscript.py -i/--ifile -o/--ofile -t/--time ...

Parameters

-h/--help

Print helpdoc

-i/--ifile

Input file, including only one column with sampleId

-o/--ofile

Output file, including two columns, the 1st column is sampleId, the 2nd column is attribute information

-t/--time

Time for interval (seconds, default 5s)

...

'''

在需要时将这个变量打印出来即可:

try:

opts,args = getopt.getopt(argv,"hi:o:t:n:",["ifile=","ofile=","time="])

if len(opts) == 0:

print("Options Error!\n\n"+helpdoc)

sys.exit(2)

except getopt.GetoptError:

print("Options Error!\n\n"+helpdoc)

sys.exit(2)

3.3. 实现实例

import getopt

.

.

.

if __name__ == '__main__':

...

helpdoc = '''

Description

This script is used to grab SRA sample attributes information based on SampleId

Usage

python webspider_ncbiBiosample.py -i/--ifile -o/--ofile -t/--time -n/--requests-number

Parameters

-h/--help

Print helpdoc

-i/--ifile

Input file, including only one column with sampleId

-o/--ofile

Output file, including two columns, the 1st column is sampleId, the 2nd column is attribute information

-t/--time

Time for interval (seconds, default 5s)

-n/--requests-number

Setting the requests number between interval (default 10)

'''

# 获取命令行参数

try:

opts,args = getopt.getopt(argv,"hi:o:t:n:",["ifile=","ofile=","time="])

if len(opts) == 0:

print("Options Error!\n\n"+helpdoc)

sys.exit(2)

except getopt.GetoptError:

print("Options Error!\n\n"+helpdoc)

sys.exit(2)

# 设置参数

for opt,arg in opts:

if opt in ("-h","--help"):

print(helpdoc)

sys.exit()

elif opt in ("-i","--ifile"):

infile = arg

elif opt in ("-o","--ofile"):

outfile = arg

# 若指定的输出文件已经存在,让用户决定覆盖该文件,还是直接退出程序

if os.path.exists(outfile):

keyin = input("The output file you specified exists, rewrite it?([y]/n: ")

if keyin in ("y","Y",""):

os.remove(outfile)

elif keyin in ("n","N"):

print("The output file existed!\n")

sys.exit(2)

else:

print("Input error!\n")

sys.exit(2)

elif opt in ("-t","--time"):

sleep_time = int(arg)

elif opt in ("-n","--requests-number"):

requestNum = int(arg)

.

.

.

参考资料:

python调用perl_在Perl、Shell和Python中传参与输出帮助文档相关推荐

  1. shell执行perl_【编程技巧(一)】在Perl、Shell和Python中传参与输出帮助文档

    社会你明哥,人狠话又多![小明的碎碎念]与你不见不散!作为一名搞数据的生物狗,咱们是生物狗中代码写得最六的,程序员中生物学得最好的--大家没意见吧,有意见请憋着 跟随小明的步伐,让我们开开心心地写Bu ...

  2. Word处理控件Aspose.Words功能演示:在 Python 中比较两个 Word 文档

    在各种情况下执行 Word 文档的比较以确定差异.各种在线工具允许您比较 Word 文档,但是,您可能需要在应用程序中实现比较功能.为实现它,本文展示了如何在 Python 中比较两个 Word 文档 ...

  3. 计算机毕业设计Python+django 宠物领养中心小程序(源码+系统+mysql数据库+Lw文档)

    项目介绍 据世界动物保护协会统计,全世界大概有5亿只流浪狗和散养的狗和大致同样数量的流浪猫,而这些主要源于主人的弃养.同时,在很多地区,狗和猫都处于散养状态,这部分的动物,也经常会变成流浪动物.猫和狗 ...

  4. 计算机毕业设计Python+django的零食销售商城网站(源码+系统+mysql数据库+Lw文档)

    项目介绍 ​随着人们生活条件的改善,人们对生活的追求也越来越高.在闲暇之时品尝上美味的零食,是当前很多人的一个休闲方式.当前临时市场鱼目混杂,种类繁多很多消费者不知道如何去选购更加美味可口的零食.尤其 ...

  5. python模块大全doc_Python pydoc模块详解:查看、生成帮助文档

    前面己经介绍了为函数.类.方法等编写文档(只要在函数.类.方法定义后定义一个字符串即可).前面也介绍了使用 help() 函数和 __doc__ 属性来查看函数.类.方法的文档,但这种方式总是在控制器 ...

  6. 基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署

    基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署 基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部 ...

  7. 使用C++控制台程序或Python调用Dll创建Qt界面(dll中创建QApplication,qtwinmigrate的使用)

    目录 理论 构建DLL 使用Python进行调用 使用C++控制台程序进行调用 理论 在Windows下,可能要用MFC或C#或Java,python调用一个插件,这个插件是一个dll,可以弄一个Qt ...

  8. python调用c语言函数_从Python调用C函数

    python调用c语言函数 We can call a C function from Python program using the ctypes module. 我们可以使用ctypes模块从P ...

  9. python调用excel的宏_在 Excel 中使用 Python 开发宏脚本

    文 | varlemon 编辑 | EarlGrey 推荐 | 编程派公众号(ID:codingpy) 之前发文介绍过一个叫GridStudio的神器,可以在网页版应用中将 Python 与表格处理结 ...

最新文章

  1. 使用存储过程更新数据库!成功了但是返回值为 -1 的变态问题的解决办法!
  2. java观察者模式_Java设计模式之观察者模式详解
  3. @SkipValidation跳过Struts2validation校验器
  4. spring 整和activemq
  5. 数组中第K个最大元素
  6. unique函数_C++核心准则C.35:基类的析构函数必须满足的条件
  7. 统计订单:复选+全选+计算 的列表
  8. ps裁剪和裁切的区别_PS裁剪和裁切的区别
  9. 如何发送gmail邮件_如何从R和Gmail发送电子邮件
  10. 《白夜行》读后感:白夜行走,暗中羁绊
  11. IT架构师_隽语集(Design Thinking _0101)
  12. 永恒之蓝(Eternal Blue)复现
  13. 我记得你往日的样子----聂鲁达
  14. 【论文笔记】MV3D:Multi-View 3D Object Detection Network for Autonomous Driving
  15. PyCharm如何自定义调整字体大小的快捷键
  16. asp.net报错:ConnectionString 属性尚未初始化
  17. 「LOJ6482」LJJ爱数数
  18. 20220304-0307es
  19. Google Earth Engine OEEL——Open Earth Engine extension 插件,事半功倍的GEE辅助神器(附链接)
  20. 计算机应用统考软件如何安装,计算机应用基础统考软件使用手册

热门文章

  1. latex 不等于_生活中养成这8个习惯,就算不运动,照样瘦!
  2. 6 计算机应用技,2019年10月自考计算机应用技术习题及答案6
  3. brew php mysql_MAC下用homebrew安装及配置apache、php和mysql
  4. 【征稿倒计时—山东科技大学主办】 2021智能装备与特种机器人国际会议(ICIESR2021)...
  5. 一个单片机的小问题。
  6. Nexys4 DDR + OV7670 摄像头实时监控系统
  7. linux单次任务调度,go任务调度2(linux的cron调用)
  8. java传值的代码_SpringMVC的简单传值(实现代码)
  9. 联想拯救者y7000电池耗电快_游戏新选择:联想2020款拯救者Y7000/R7000爆料
  10. linux prc 时区,授时时区问题解决