你好,我是 bash 脚本的新手,我有下面的代码,它运行时没有任何错误或完成退出。我想在标准输出中添加一行失败消息或最后退出,只是为了确保它是否成功。你们中的任何人都会帮助我。谢谢 PS-如果可能的话可以帮助获得更通用的内容。
#!/usr/bin/env bash
fastq-dump --split-files SRR531199
head -n 2000000 SRR531199_1.fastq > SRR531199_1.500k.fastq
head -n 2000000 SRR531199_2.fastq > SRR531199_2.500k.fastq
for dataset in SRR497965 SRR497966 SRR497967 SRR497968 ERR1716491
do
fastq-dump -M 1000 --table SEQUENCE $dataset
done
我从网站末尾的应用程序中的本教程中获得的代码:
http://evomics.org/learning/assemble-and-alignment/2018- assembly-kmer-lab/
答案1
有多种方法可以对命令或脚本的退出代码进行操作。在您的情况下,由于您要循环多个命令,因此最好收集每个命令的退出代码,如下所示:
failures=0
fastq-dump --split-files SRR531199
head -n 2000000 SRR531199_1.fastq > SRR531199_1.500k.fastq
head -n 2000000 SRR531199_2.fastq > SRR531199_2.500k.fastq
for dataset in SRR497965 SRR497966 SRR497967 SRR497968 ERR1716491
do
fastq-dump -M 1000 --table SEQUENCE "$dataset" || ((failures++))
done
if ((failures>=1)); then
echo "Script had $failures failures"
exit $failures
else
exit 0
fi
这将为failures
循环中以非零值退出的每个命令的变量加 1。然后它将回显它计数的失败次数并以该数字退出。
答案2
这取决于你想要什么:
如果您想分别检查所有
fastq-dump
和head
- 命令:&& echo THIS_COMMAND worked || echo THIS_COMMAND failed
在这些行的末尾添加。 (替换THIS_COMMAND
为您测试的命令)。您不能将其用于for
,do
但这done
没有多大意义(这些不是命令,而是生成 for 循环的东西)。如果您想检查整个脚本是否有效,并希望在出现故障时立即停止运行,那么我会这样做:
- 放在
|| exit
每行的末尾(同样,for
,do
和除外done
) - 将这一行放在
echo everything worked
脚本的末尾
- 放在
也可能但不那么简单的是组合:
#!/usr/bin/env bash
fastq-dump --split-files SRR531199 ; if [ $? -ne 0 ] ; then echo splitting failed ; exit ; fi
head -n 2000000 SRR531199_1.fastq > SRR531199_1.500k.fastq ; if [ $? -ne 0 ] ; then echo first head failed ; exit ; fi
head -n 2000000 SRR531199_2.fastq > SRR531199_2.500k.fastq ; if [ $? -ne 0 ] ; then echo 2nd head failed ; exit ; fi
for dataset in SRR497965 SRR497966 SRR497967 SRR497968 ERR1716491
do
fastq-dump -M 1000 --table SEQUENCE $dataset ; if [ $? -ne 0 ] ; then echo working with $dataset failed ; exit ; fi
done
echo everything worked
当出现故障时,这会立即停止脚本并告诉您失败的原因。如果一切正常,它也会提到这一点。
被警告:每种方法都取决于这样一个事实:工作命令以返回码 0 退出,而失败的命令则不会。 Linux 系统上的大多数命令都是这种情况(当然head
,但我不能fastq-dump
肯定地说同样的事情)