bash를 사용하여 명령줄에서 작은 따옴표를 사용하는 프로그램을 반복합니다. 여기서 작은 따옴표는 bash 스크립트의 의도를 무효화합니다.

bash를 사용하여 명령줄에서 작은 따옴표를 사용하는 프로그램을 반복합니다. 여기서 작은 따옴표는 bash 스크립트의 의도를 무효화합니다.

질문:

디렉터리의 각 .fna 파일에 대해 bash 루프에서 프로그램을 실행할 수 있기를 원하지만 출력 파일의 파일 이름이 확장자 없이 동일해지기를 원합니다. 문제는 프로그램이 작은따옴표를 사용하여 지정한다는 것입니다. 출력 문서. 따라서 스크립트를 실행하면 다음과 같은 메시지가 인쇄됩니다.

outputfile

암호:

 for fna in $(find . -name "*.fna")
do
    outputname = ${fna%.fna}
    outputfile = $outputname.rrna
    barrnap $fna --outseq 'outputfile'
done

입력 예

이름이 하나:

GCF_000003135.1_ASM313v1_genomic.fna

콘텐츠를 예로 들어보겠습니다.

>NZ_GG666849.1 Bifidobacterium longum subsp. longum ATCC 55813 SCAFFOLD1, whole genome shotgun 
sequence
AACCCCGTGGAGTTCACACAACAAGGTGTATTTAGTCAAGTCGGTGTTTCGTGTTTCGTCACTGATTTTTTTCACTGCGG
AAA

원하는 출력:

프로그램의 출력 파일 이름은 다음과 같습니다.

GCF_000003135.1_ASM313v1_genomic.rrna

혼란을 드려 죄송합니다. 이것을 설명하는 가장 좋은 방법을 생각하는 데 어려움을 겪고 있으며 누구든지 제목 개선을 제안할 수 있으면 즉시 제목을 변경하겠습니다.

답변1

이 프로그램은 작은따옴표를 사용하지 않습니다. 작은따옴표는 쉘이 인용된 문자열에 대해 변수 확장을 수행하는 것을 방지하는 데 사용됩니다. 쉘은 프로그램을 호출하기 전에 따옴표를 제거합니다.

이 경우, 작은따옴표가 인용하는 문자열은 쉘이 수행할 확장이 없는 일반 문자열이기 때문에 아무 작업도 수행하지 않습니다(이것은 코드의 버그이므로 $outputfile큰따옴표를 사용해야 할 수도 있습니다).

파일이 현재 디렉터리(그리고 그 디렉터리에만 있는 경우)에 있으면 다음을 수행할 수 있습니다.

for fasta in ./*.fna; do
    barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
done

또는 중간 변수를 사용하세요.

for fasta in ./*.fna; do
    outfile="${fasta%.fna}.rrna"
    barrnap --outseq "$outfile" "$fasta"
done

여기서는 작은따옴표 대신 큰따옴표를 사용합니다.생각하다쉘은 확장을 실행합니다. 또한 입력 파일 이름을 호출에서 명령줄 끝으로 옮겼습니다. barrnap입력 파일 이름도 호출로 옮겼습니다.수동.

파일이 현재 디렉터리 내의 여러 하위 디렉터리에 있고 이를 사용해야 하는 find경우 출력을 반복하는 대신 프로그램을 호출해 find보겠습니다 .find

find . -type f -name '*.fna' -exec sh -c '
    for fasta do
        barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
    done' sh {} +

여기서는 find쉘 루프에 대한 경로 이름 생성기처럼 작동합니다.

관련된:


=. 를 할당할 때 주위에 공백이 없어야 하기 때문에 코드에 일부 구문 오류가 있습니다. 또한 변수 확장은 큰따옴표로 묶어야 합니다.

관련 정보