我们的生物信息学马拉松授课里面的转录组实战环节介绍了批量一次性的针对全部的样品运行一个shell脚本的实战演练,代码如下所示:
ls *gz|cut -d"_" -f 1|sort -u |while read id;do
nohup trim_galore -q 25 --phred33 --length 36 --stringency 3 --paired -o ../cleanData ${id}*.gz 1>${id}_out.txt 2>${id}_log.txt &
done
只需要是自己的Linux操作系统里面有trim_galore这个软件在环境变量里面,就可以把当前文件夹里面的全部的gz格式的fastq文件进行批量一次性的运行。比如如下所示文件:
ls -lh |cut -d" " -f 5-
197K 2月 20 10:36 SRR10574381_1.fastq.gz
208K 2月 20 10:36 SRR10574381_2.fastq.gz
198K 2月 20 10:36 SRR10574382_1.fastq.gz
201K 2月 20 10:36 SRR10574382_2.fastq.gz
206K 2月 20 10:36 SRR10574383_1.fastq.gz
-------
这个代码里面有一个重难点, 就是 1>${id}_out.txt 2>${id}_log.txt
的理解,涉及到了 (stdout
)重定向到标准错误(stderr
)的语法。果不其然,很多学员表示不能理解。
老师,如果是想把输出结果传递到log中,为什么是2>test.log? 为什么不能用管道符号|
简单的两个输入数值加和的脚本
我这里自己编写一个测试脚本(sum.sh ),如下所示:
#!/bin/bash
# 检查是否传入了两个参数
if [ $# -ne 2 ]; then
echo "Usage: $0 <number1> <number2>" >&2
exit 1
fi
# 将输入参数存储在变量中
num1=$1
num2=$2
# 检查输入参数是否为数值
if ! [[ $num1 =~ ^-?[0-9]+$ ]] || ! [[ $num2 =~ ^-?[0-9]+$ ]]; then
echo "Error: Both arguments must be numeric values." >&2
exit 1
fi
# 执行加法运算,并将结果输出到results文件
sum=$((num1 + num2))
echo $sum
接下来就可以测试这个脚本(sum.sh )啦:
bash sum.sh 1 2
bash sum.sh 1 abc
bash sum.sh 1 2 1>out1.txt 2>log1.txt
bash sum.sh 1 abc 1>out2.txt 2>log2.txt
其实看一下上面的脚本运行后输出日志就明白了:
bash sum.sh 1 2 1>out1.txt 2>log1.txt
:因为是正确的输入,脚本正常运行,然后将结果重定向到out1.txt,所以out1.txt里面是有内容的。因为没有任何错误消息产生,所以log1.txt是空的。bash sum.sh 1 abc 1>out2.txt 2>log2.txt
:因为是错误的输入,脚本就会报错,将错误消息重定向到log2.txt,因为错误消息被重定向了,所以out2.txt是空的。