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

社会你明哥,人狠话又多!【小明的碎碎念】与你不见不散!作为一名搞数据的生物狗,咱们是生物狗中代码写得最六的,程序员中生物学得最好的——大家没意见吧,有意见请憋着

949364e8a18c101a05a79eaa83bd278e.gif

跟随小明的步伐,让我们开开心心地写Bug吧

2dd450ee7b1245f0d7b50ecae2dec71c.gif

我们的口号是什么?日常写bug,偶尔写代码

ee13242eccc9446edb12c54b146d1fda.gif

下面是正文


目录
  1. Perl
    1.1. Perl中getopt传参
    1.2. Perl中输出帮助文档
    1.3. 实现实例

  2. Shell
    2.1. Shell中的getopt传参
    2.2. Shell中输出帮助文档
    2.3. 实现实例

  3. Python
    3.1. Python中的getopt传参
    3.2. Python中输出帮助文档
    3.3. 实现实例


基于本人对多种编程语言的粗浅了解,不论是哪种编程语言它的参数传递方式主要分为下面两类:

  • 直接传递(以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] VARIABLE

option:表示为某个脚本可以使用的选项

":":如果某个选项(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之间

之所以使用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
    helpdocexit 1fiwhile getopts "hS:k:R:i:" optdocase $opt in
        h)
            helpdocexit 0
            ;;
        S)
            strain=$OPTARG# 检测输入的strain名是否合格:是否含有非法字符"/"if [[ $strain =~ "/" ]]thenecho "Error in specifing strain name, if exist character \"/\", place \"/\" with \"_\""
                helpdocexit 1fiif [ ! -d $workdir/SAM/$strain ]thenecho "There is no such folder coresponding to $strain"
                helpdocexit 1fi
            ;;
        R)
            index=$OPTARG
            ;;
        k)
            vcf=$OPTARGif [ ! -f $vcf ]thenecho "No such file: $vcf"
                helpdocexit 1fi
            ;;    
        i)
            intervals=$OPTARGif [ ! -f $bed ]thenecho "No such file: $intervals"
                helpdocexit 1fi
            ;;
        ?)echo "Unknown option: $opt"
            helpdocexit 1
            ;;esacdone
.
.
.

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)

    .
    .
    .

参考资料:

(1) 小明github笔记:Perl进阶笔记

https://github.com/Ming-Lian/Bioinformatics-skills/blob/master/Perl%E8%BF%9B%E9%98%B6%E7%AC%94%E8%AE%B0.md

(2) 小明github笔记:实用小脚本

https://github.com/Ming-Lian/Bioinformatics-skills/blob/master/%E5%AE%9E%E7%94%A8%E5%B0%8F%E8%84%9A%E6%9C%AC.md

(3) 小明github笔记:Linux (Raspbian) 操作进阶——Shell编程

https://github.com/Ming-Lian/Hello-RaspberryPi/blob/master/Linux%E6%93%8D%E4%BD%9C%E8%BF%9B%E9%98%B6.md#shell-programing

(4) Python 命令行参数和getopt模块详解

https://www.cnblogs.com/kex1n/p/5975722.html


【小明的碎碎念】系列往期精彩文章:

(1)三代测序入门:技术原理与技术特点

(2)三代测序入门:PacBio数据分析

d3a673b96b8807bf675f53e82b942f2a.png

85aa0572e1b3d6cc6477768c60422baa.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之路2.0_Python之路【第二十一篇】:JS基础

1.2 ECMAScript尽管 ECMAScript 是一个重要的标准&#xff0c;但它并不是 JavaScript 唯一的部分&#xff0c;当然&#xff0c;也不是唯一被标准化的部分。实际上&#xff0c;一个完整的 JavaScript 实现是由以下 3 个不同部分组成的&#xff1a;● 核心(ECMAScript)● 文档对象…

solr4 mysql自动更新_(solr系列:五) solr定时实时重建索引和增量更新

将mysql中的数据导入到了solr中之后&#xff0c;如果数据库中的数据有变动&#xff0c;solr中还是第一次导入的旧的数据&#xff0c;那该如何是好呢&#xff1f;该如何实现mysql数据库中的数据定时同步到solr中呢&#xff1f;下面将做详细的介绍。准备工作要做好&#xff1a;1、…

mysql pydev_pydev-python 链接mysql数据库(mac系统)

在mac os上安装MySQLdb&#xff0c;遇到了非常多问题&#xff0c;总结一下&#xff1a;首先。假设用sudo easy_install mysql-python命令安装&#xff0c;基本上不会成功的&#xff0c;原因有两个&#xff1a;一是找不到mysql_config位置&#xff0c;二是如今基本上安装的是64位…

上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...

一、选择题: 将唯一正确的选项写在题前括号中.每题2分.【】(1) 本课程的目标定位是什么?[A] 学习Python语言[B] 学习计算机的工作原理[C] 学习各种算法[D] 学习用计算机解决问题【】(2) 下列哪个标识符是合法的?[A] var-name [B] !#$% [C] _100 [D] elif【】(3) 执行下列语句…

mysql 安装测试ok_tpcc-mysql安装测试与使用的实例教程

1&#xff1a;下载tpcc-mysql的压缩包&#xff0c;从下面的网站进行下载也可直接从叶总博客直接下载&#xff1a;我这边使用的就是后者。2&#xff1a;安装tpcc-mysql[rootmxqmongodb2 tpccmysql]# gunzip tpcc-mysql-src.tgz[rootmxqmongodb2 tpccmysql]# tar xf tpcc-mysql-s…

python多线程写同一文件_Python多线程写文件实例

# -*- coding: utf-8 -*-import threading多线程生成日志工具__author ["yangfei" ]#该方法主要用于写入300行WARN日志def writeWarnLog(file):count0;while count<300:try:file.write(2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n)count1except Except…

java asc码_Java中ASC码与字符互相转化

package com.ljq.test;/*** Java中ASC码与字符互相转化** author jiqinlin**/public class ASCTest {private static int ascNum;private static char strChar;public static void main(String[] args) {System.out.println(getAsc("a"));System.out.println(backcha…

hp 导出日志 远程管理卡_惠普服务器远程管理卡安装详解

可以远程管理服务器。带惠普基于Web的网络资源管理和性能监视工具HP Toptools惠普远程管理卡的主要功能是可以实现对服务器的远程监控&#xff0c;其中包括察看日志、远程诊断、远程开/关机、重启等等。基于惠普远程管理卡的重要功能&#xff0c;本文将着重介绍惠普远程管理卡的…

java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟

本方法因为是根据思路纯手写&#xff0c;代码可以再简化&#xff0c;功能尝试没问题&#xff0c;最主要就是在登陆验证中的逻辑&#xff0c;checkLogin()方法是登录前的验证&#xff0c;而真正的登陆方式采用的是Shiro&#xff0c;若不是采用Shiro登陆&#xff0c;将该逻辑采用…

java 监听器 分类_java过滤器和监听器详解 分类: 学习专区

过滤器1、Filter工作原理(执行流程)当客户端发出Web资源的请求时&#xff0c;Web服务器根据应用程序配置文件设置的过滤规则进行检查&#xff0c;若客户请求满足过滤规则&#xff0c;则对客户请求&#xff0f;响应进行拦截&#xff0c;对请求头和请求数据进行检查或改动&#x…

linux java启动脚本文件_不错的linux下通用的java程序启动脚本

#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用&#xff0c;#也可以作为启动java程序的独立脚本来使用。##Author: tudaxia.com, Date: 2011/6/7##警告!!!&#xff1a;该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。…

linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞

发布日期&#xff1a;2014-04-10CVE ID&#xff1a;CVE-2014-0160受影响的软件及系统&#xff1a;OpenSSL 1.0.1&#xff0d;OpenSSL 1.0.1fOpenSSL 1.0.2-betaOpenSSL 1.0.2-beta1未受影响的软件及系统&#xff1a;OpenSSL 0.9.8OpenSSL 1.0.0OpenSSL 1.0.1gOpenSSL 1.0.2-bet…

mysql数据库主要负责存储_mysql数据库自带数据库介绍

show databases&#xff1b;查看mysql自带数据库有information_schema&#xff0c;mysql&#xff0c; performance_schema&#xff0c; testinformation_schema数据库有40张表&#xff0c;如下。在MySQL中&#xff0c;把 information_schema 看作是一个数据库&#xff0c;确切说…

python 编辑数学公式_Jupyter快速编辑高大上数学公式 泰勒展开式

欢迎点击「算法与编程之美」↑关注我们&#xff01;本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列博客。人工智能的基础是机器学习&#xff0c;而通过之前的几篇博客了解到&#xff0c;机器学习的基础是数学…

用猎物皮毛换酒喝java_荒野大镖客2三星毛皮狩猎技巧分享 各种类猎物三星皮毛获取方法...

荒野大镖客2三星毛皮怎么获得&#xff1f;想必很多朋友都还不是很清楚吧&#xff0c;所以呢小编今天给大家带来的就是荒野大镖客2三星毛皮狩猎技巧分享&#xff0c;需要的朋友还不快进来看看&#xff1f;三星毛皮狩猎技巧分享猎物体型分水岭建议以狐狸类为例。(1)中型猎物[比狐…

Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用...

近来由于项目需要&#xff0c;需要用到手机短信验证码的功能&#xff0c;其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口&#xff0c;下面我把我在项目中用到的记录一下&#xff0c;以便给大家提供个思路&#xff0c;由于本人的文采有限&#xff0c;还请大…

java中select的用法_mybaties中select用法,以及常用增删改查

查询语句是使用 MyBatis 时最常用的元素之一select元素配置细节如下属性描述取值默认id在这个模式下唯一的标识符&#xff0c;可被其它语句引用parameterType传给此语句的参数的完整类名或别名resultType语句返回值类型的整类名或别名。注意&#xff0c;如果是集合&#xff0c;…

Js获取短信验证码前段效果

一&#xff1a;先上效果图&#xff1a; 二&#xff1a;源代码文件&#xff1a;reg.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http:…

java简述标识符和保留字区别_Java 基础语法 - 流年似水莫停留的个人页面 - OSCHINA - 中文开源技术交流社区...

Java 基础语法一个Java程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的…

java拉丁正方形_LeetCode JAVA解题---824. 山羊拉丁文

LeetCode 题库 全 JAVA 解题824. 山羊拉丁文原题回顾&#xff1a;给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下&#xff1a;如果单词以元音开头(a, …