이 bash 스크립트가 있는데 종료를 완료하려면 어떻게 개선해야 합니까?

이 bash 스크립트가 있는데 종료를 완료하려면 어떻게 개선해야 합니까?

안녕하세요, 저는 bash 스크립팅을 처음 사용합니다. 다음 코드가 있고 오류 없이 실행되거나 종료를 완료합니다. 나는 성공했는지 확인하기 위해 실패 메시지나 끝 부분에 종료를 포함하는 행을 표준 출력에 추가하고 싶습니다. 여러분 중 누구라도 나를 도와줄 것입니다. 추신 감사합니다. 가능하다면 좀 더 일반적인 내용에 도움이 될 수 있습니다.

#!/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

이는 failures0이 아닌 값으로 종료되는 루프의 각 명령에 대해 변수를 1씩 증가시킵니다. 그런 다음 계산한 실패 횟수를 다시 에코하고 해당 숫자로 종료합니다.

답변2

그것은 당신이 원하는 것에 달려 있습니다:

  • fastq-dump모든 명령 과 head- 명령을 별도로 확인하려면 && echo THIS_COMMAND worked || echo THIS_COMMAND failed이 줄 끝에 추가하세요. ( THIS_COMMAND테스트한 명령으로 바꾸십시오). for for에 사용할 수는 없지만 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

관련 정보