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.pswp.cn/news/443610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443610.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目開發中的編碼規范

1.規范存在的意義&#xff1a; 好的編碼規范可以盡可能的減少一個軟件的維護成本 , 并且幾乎沒有任何一個軟件&#xff0c;在其整個生命周期中&#xff0c;均由最初的開發人員來維護&#xff1b; 好的編碼規范可以改善軟件的可讀性&#xff0c;可以讓開發人員盡快而徹底地理解…

mysql 5.6.36安裝圖解_2017年12月聚合文章--實戰-Mysql5.6.36腳本編譯安裝及初始化 | 碼友網...

概述本文為centos7.3自動化編譯安裝mysql5.3.6的腳本及后續初始化操作&#xff0c;話不多少&#xff0c;直接上腳本。安裝腳本install.py如下&#xff1a;#codingutf-8#!/usr/bin/pythonimport os,commands#定義變量install_dir /data/mysqldata_dir /data/mysql/datapackage…

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位…

MySQL多個線程同時寫數據_多個線程可以同時將數據寫入文件嗎?

同步聲明可以做到這一點。嘗試下面的代碼&#xff0c;我在類似的情況下使用。package hrblib;import java.io.*;public class FileOp {static int nStatsCount 0;static public String getContents(String sFileName) {try {BufferedReader oReader new BufferedReader(new F…

Java在Linux下創建文件,文件夾,刪除,拷貝文件的命令

1.創建&#xff0c;刪除文件夾,復制文件夾 mkdir,rmdir如:mkdir -p dir1/dir2 //-p表示遞歸創建文件夾 cp -r /tmp/a /root/a //拷貝不強制覆蓋cp -rf /tmp/a /root/a //拷貝強制覆蓋 2.創建&#xff0c;刪除文件 vi&#xff0c;touch都可以創建文件。如:vi fileNametouch f…

python 拼多多_拼多多現重大BUG被“薅羊毛”,教你如何用Python簡單褥羊毛

import timefrom urllib.parse import parse_qsimport requestsfrom bs4 import BeautifulSoupfrom selenium import webdriverfrom selenium.common.exceptions import *from selenium.webdriver.support.wait import WebDriverWait# 額外抽取的授權模塊from utils import aut…

上海交通大學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…

Tomcat6.0.37,tomcat6.0.37,下訪問Web項目,jsp項目不需要輸入項目名稱和端口號的配置方法...

1.不需要數據項目名稱就可以訪問項目的配置方法如下&#xff1a; 首先到你的Tomcat下的conf文件夾下找到server.xml文件&#xff0c;打開后修改為&#xff1a; <Host name"localhost" appBase"webapps"unpackWARs"true" autoDeploy"tru…

java合并list_java合并list方法代碼實例

這篇文章主要介紹了java合并list方法代碼實例,文中通過示例代碼介紹的非常詳細&#xff0c;對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下List包括List接口以及List接口的所有實現類。因為List接口實現了Collection接口&#xff0c;所以List接口擁有Collec…

java math 函數_Java中Math類常用函數總結

Java中比較常用的幾個數學公式的總結&#xff1a;//取整&#xff0c;返回小于目標函數的最大整數,如下將會返回-2Math.floor(-1.8)&#xff1b;//取整&#xff0c;返回發育目標數的最小整數Math.ceil()//四舍五入取整Math.round()//計算平方根Math.sqrt()//計算立方根Math.cbrt…

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…

java上傳png_java上傳png圖片出現紅色背景

java圖片上傳出現紅色背景java圖片服務器上傳圖片都很正常&#xff0c;唯獨上傳png圖片時&#xff0c;png圖片變成紅色背景原因是讀取上傳數據時用的是ImageIO.read(inputstream)方法public static BufferedImage getImages(byte[] data) throws IOException {ByteArrayInputSt…

java 引用隊列_Java中管理資源的引用隊列相關原理解析

當對象改變其可達性狀態時&#xff0c;對該對象的引用就可能會被置于引用隊列(reference queue)中。這些隊列被垃圾回收器用來與我們的代碼溝通有關對象可達性變化的情況。這些隊列是探測可達性變化的最佳方式&#xff0c;盡管我們也可以通過檢查get方法的返回值是不是null來探…

Tomcat 替換項目圖標

1.首先制作一個32*32像素的圖標&#xff0c;命名為favicon.ico這里名稱必須是和Tomcat的webapps下的ROOT下的一樣。 2.把制作好的圖標放到你要部署的Web項目的images目錄下&#xff0c;如果你的Web項目有過濾器等&#xff0c;要給后綴名為.ico的圖標放行。 3.最后你就可以在你需…

hp 導出日志 遠程管理卡_惠普服務器遠程管理卡安裝詳解

可以遠程管理服務器。帶惠普基于Web的網絡資源管理和性能監視工具HP Toptools惠普遠程管理卡的主要功能是可以實現對服務器的遠程監控&#xff0c;其中包括察看日志、遠程診斷、遠程開/關機、重啟等等。基于惠普遠程管理卡的重要功能&#xff0c;本文將著重介紹惠普遠程管理卡的…

java 錯誤登陸次數_純java代碼實現登陸次數驗證,登陸錯誤5次之后鎖定30分鐘

本方法因為是根據思路純手寫&#xff0c;代碼可以再簡化&#xff0c;功能嘗試沒問題&#xff0c;最主要就是在登陸驗證中的邏輯&#xff0c;checkLogin()方法是登錄前的驗證&#xff0c;而真正的登陸方式采用的是Shiro&#xff0c;若不是采用Shiro登陸&#xff0c;將該邏輯采用…