学徒在完成转录组实战任务的时候,出现了一个小bug,自顾自的纠结了一晚上不过来寻求我的帮助。让我非常生气,因为确实是很简单的两个小技巧,主要是理解全局变量、环境变量。
就是hisat2进行批量比对代码失效
示例:当前目录文件如下:
1.2G 10月 30 10:14 SRR1039510_1_val_1.fq.gz
1.2G 10月 30 10:14 SRR1039510_2_val_2.fq.gz
1.1G 10月 30 10:14 SRR1039511_1_val_1.fq.gz
1.1G 10月 30 10:14 SRR1039511_2_val_2.fq.gz
1.5G 10月 30 10:18 SRR1039512_1_val_1.fq.gz
1.5G 10月 30 10:18 SRR1039512_2_val_2.fq.gz
816M 10月 30 10:12 SRR1039513_1_val_1.fq.gz
820M 10月 30 10:12 SRR1039513_2_val_2.fq.gz
2.1G 10月 30 10:27 SRR1039514_1_val_1.fq.gz
2.1G 10月 30 10:27 SRR1039514_2_val_2.fq.gz
253M 10月 30 10:05 SRR1039515_1_val_1.fq.gz
253M 10月 30 10:05 SRR1039515_2_val_2.fq.gz
131M 10月 30 10:05 SRR1039516_1_val_1.fq.gz
135M 10月 30 10:05 SRR1039516_2_val_2.fq.gz
1.8G 10月 30 10:23 SRR1039517_1_val_1.fq.gz
1.8G 10月 30 10:23 SRR1039517_2_val_2.fq.gz
1.6G 10月 30 10:20 SRR1039518_1_val_1.fq.gz
1.6G 10月 30 10:20 SRR1039518_2_val_2.fq.gz
451M 10月 30 10:07 SRR1039519_1_val_1.fq.gz
458M 10月 30 10:07 SRR1039519_2_val_2.fq.gz
645M 10月 30 10:09 SRR1039520_1_val_1.fq.gz
648M 10月 30 10:09 SRR1039520_2_val_2.fq.gz
856M 10月 30 10:12 SRR1039521_1_val_1.fq.gz
859M 10月 30 10:12 SRR1039521_2_val_2.fq.gz
1.6G 10月 30 10:20 SRR1039523_1_val_1.fq.gz
1.6G 10月 30 10:20 SRR1039523_2_val_2.fq.gz
他首先定义index变量,为ref文件路径
index=/refdir/server/reference/index/hisat/hg38/genome
然后运行脚本进行hisat2比对,代码如下
for id in {08..23}
do
hisat2 -t -x $index \
-1 /home/project/rna/clean/SRR10395${id}_1_val_1.fq.gz \
-2 /home/project/rna/clean/SRR10395${id}_2_val_2.fq.gz \
-S /home/project/rna/align/SRR10395${id}.sam
done
提交脚本后出现Exit,也就是说报错了!
- 此时如何进行故障排查?
循环中加echo,查看脚本中所运行的真实代码
for id in {08..23}
do
echo hisat2 -t -x $index \
-1 /home/data/jjl/project/rna/clean/SRR10395${id}_1_val_1.fq.gz \
-2 /home/data/jjl/project/rna/clean/SRR10395${id}_2_val_2.fq.gz \
-S /home/data/jjl/project/rna/align/SRR10395${id}.sam
done
运行后真实代码打印出来如下
"hisat2 -t -x $index \
-1 /home/data/jjl/project/rna/clean/SRR1039508_1_val_1.fq.gz \
-2 /home/data/jjl/project/rna/clean/SRR1039508_2_val_2.fq.gz \
-S /home/data/jjl/project/rna/align/SRR1039508.sam"
发现$id已经成功调用08,09,10…….
但是$index
没有成功调用,echo出来还是 $index
本身,也就是说这个变量并没有被解析啊!
故障原因:在脚本中运行的代码如果要调用变量index,脚本外的环境定义的变量index是无法被成功调用的。
简言之:“全局”定义的变量不能有效覆盖“局部”脚本内变量的调用需求!
- 应该如何解决故障?
必须在脚本内现场定义变量进行赋值index,然后脚本内才能成功调用index。
因此调整脚本全部的代码如下(即添加下面第一行)
# 添加这一行
index=/refdir/server/reference/index/hisat/hg38/genome
# 后面代码不变
for id in {08..23}
do
echo hisat2 -t -x $index \
-1 /home/project/rna/clean/SRR10395${id}_1_val_1.fq.gz \
-2 /home/project/rna/clean/SRR10395${id}_2_val_2.fq.gz \
-S /home/project/rna/align/SRR10395${id}.sam
done
运行成功!
两个小tips
- 写好的脚本需要多echo看看。
- 先运行测试数据看自己的脚本是否正确,然后上真实的大量样品数据项目。