Linux Bash 스크립팅은 파일 이름 목록에서 터미널 명령을 실행합니다.

Linux Bash 스크립팅은 파일 이름 목록에서 터미널 명령을 실행합니다.

특정 파일 다운로드 도구(sratools)에서 입력으로 사용하려고 하는 파일 이름 목록이 포함된 파일이 있지만 내 스크립트에 문제가 있습니다.

#!/bin/bash
input="<path_to_directory>/SRR_Acc_List.txt"
while IFS= read -r line
do 
    "<path_to_tool>/fastq-dump -O <desired_output_directory/ $line"
    echo "Downloading $line file"
done <"$input"

명령은 단일 입력에서 작동하며 에코는 정확하지만 명령 부분에서 오류가 발생합니다.

line 6: ./fastq-dump -O ../../DATA_fastQ/ SRR1975008: No such file or directory

내가 잘못한 부분을 지적해 주시면 감사하겠습니다!

답변1

이 줄

"<path_to_tool>/fastq-dump -O <desired_output_directory/ $line"

해야한다

"<path_to_tool>/fastq-dump" -O "<desired_output_directory/" "$line"
#       unquoted spaces    ^  ^     they separate words    ^

그래서 단어가 4개가 있어요. 원래 줄은 전체적으로 인용되었으며 명령 이름이라는 한 단어로 해석되었습니다. "명령 이름"은 로 시작하므로 ./파일이나 디렉터리여야 합니다. 그러나 리터럴 이름을 가진 파일이나 디렉터리가 없으므로 ./fastq-dump -O ../../DATA_fastQ/ SRR1975008오류가 발생합니다.

실제 값에 공백 등이 포함된 경우를 대비하여 <path_to_tool>/fastq-dump인용 했습니다 . <desired_output_directory/오류 메시지를 보면 그렇지 않다는 것을 알 수 있지만 일반적으로 그럴 수도 있습니다.

인용하시는 것이 매우 좋습니다(예: 여기: done <"$input"). 문제는 특정 문자열을 별도로 처리해야 하는 한 쌍의 따옴표를 사용했다는 것입니다.

관련 정보