我有这个 bash 脚本,但如何改进才能完成退出?

我有这个 bash 脚本,但如何改进才能完成退出?

你好,我是 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-dumphead- 命令:&& echo THIS_COMMAND worked || echo THIS_COMMAND failed在这些行的末尾添加。 (替换THIS_COMMAND为您测试的命令)。您不能将其用于fordo但这done没有多大意义(这些不是命令,而是生成 for 循环的东西)。

  • 如果您想检查整个脚本是否有效,并希望在出现故障时立即停止运行,那么我会这样做:

    1. 放在|| exit每行的末尾(同样,for,do和除外done
    2. 将这一行放在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肯定地说同样的事情)

相关内容