2016-03-15 44 views
0

我是新来的bash脚本。我写了一个包含定义的声明变量的一组小命令(例如SAMPLENAME = Alex)。现在,我想要每次都从一个文件中用不同的声明变量值(例如SAMPLENAME = John)来循环此脚本。如何循环每次使用不同变量值的bash脚本

例如:我已设置下列变量

#!/bin/bash 
tID=000H003HG.TAAGGCGA+GCGATCTA 
tSM=Alex 
tLB=lib1 
O_FOLDER_NAME=HD690_Alex 

这是将使用的变量abolve值要执行的命令值,

bwa mem -V -M -R "@RG\tID:${tID}\tSM:${tSM}\tPL:ILLUMINA\tLB:${tLB}"  REFERENCES/$REFERENCE.fa "<zcat OUTPUT/2_TRIMMED_DATA/$O_FOLDER_NAME/split-adapter-quality-trimmed/${O_FOLDER_NAME}-READ1.fastq.gz" "<zcat OUTPUT/2_TRIMMED_DATA/${O_FOLDER_NAME}/split-adapter-quality-trimmed/${O_FOLDER_NAME}-READ2.fastq.gz" > OUTPUT/3_MAPPED_READS/${O_FOLDER_NAME}/aligned_reads.sam 

现在上述命令的执行之后,我想让它循环以下不同的声明变量的值集合,

#!/bin/bash 
tID=000998U3HG.STPUIHY+UIYUSIA 
tSM=John 
tLB=lib2 
O_FOLDER_NAME=HD700_John 

谢谢!

回答

1

如果你有一个空格分隔的文件,其字段为tID,tSM,tLBO_FOLDER_NAME,只是read这些。

while read -r tID tSM tLB O_FOLDER_NAME; do 
    bwa mem -V -M \ 
     -R "@RG\tID:${tID}\tSM:${tSM}\tPL:ILLUMINA\tLB:${tLB}" \ 
    REFERENCES/"$REFERENCE".fa \ 
    "<zcat OUTPUT/2_TRIMMED_DATA/$O_FOLDER_NAME/split-adapter-quality-trimmed/${O_FOLDER_NAME}-READ1.fastq.gz" \ 
    "<zcat OUTPUT/2_TRIMMED_DATA/${O_FOLDER_NAME}/split-adapter-quality-trimmed/${O_FOLDER_NAME}-READ2.fastq.gz" \ 
     > OUTPUT/3_MAPPED_READS/"${O_FOLDER_NAME}"/aligned_reads.sam 
done <file 

如果输入文件是CSV格式,则需要使用IFS什么摆弄,但是这是基本原则。

对于您的两个示例,该文件可能包含以下内容。

000H003HG.TAAGGCGA+GCGATCTA Alex lib1 HD690_Alex 
000998U3HG.STPUIHY+UIYUSIA John lib2 HD700_John 

如果文件中有你的脚本之外没有用的,你可能想使用一个here document代替。

+0

的'“ tripleee

+0

因此,我从你的回答中了解到,我所要做的就是创建一个空白分隔的文件。例如tID tSM tLB和它们在这条线下面的不同值?或者在这条线的前面?脚本执行一次后,bash脚本会从文件中调用另一组值?请纠正我,如果我误解任何一点。 –

+0

看到更新。 – tripleee

0

做到这一点是改变的变量是文件的一种方式 -

#!/bin/bash 
echo tID=000H003HG.TAAGGCGA+GCGATCTA 
echo tSM=Alex 
echo tLB=lib1 
echo O_FOLDER_NAME=HD690_Alex 

,然后运行 ​​-

eval $(./var_file.sh) && your command