この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-assemblies-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テストしたコマンドに置き換えてください)。 forforには使用できませんが、doそれほど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

関連情報