사용자 입력에서 접두사 목록이 포함된 파일을 읽은 다음 while 루프에서 접두사를 사용하여 파일을 호출합니다.

사용자 입력에서 접두사 목록이 포함된 파일을 읽은 다음 while 루프에서 접두사를 사용하여 파일을 호출합니다.

사용자 입력 파일을 while 루프로 보내려고 하는데 스크립트를 실행할 때 계속 실패합니다.

사용자 입력 파일에는 genelist다른 파일의 접두어로 사용했던 숫자 목록이 포함되어 있습니다. 예를 들어. 012.laln, 012.모델.

유전자 목록:

012
013
025
039
109
.
.
.

다음은 제가 테스트한 스크립트입니다.

#!/usr/bin/env bash
read -pr "genefile: " genelist
read -pr "treefile: " trees
read -pr "workers: " workers

while read -r i; do
    while read -r j; do
        raxml-ng --sitelh --msa "$i".laln --model "$j".model --tree "${trees}" --workers "${workers}" --prefix "$i"-rT;
    done < "$genelist".model; 
done < "$genelist"

raxml-ng 도구를 실행하려면 출력 파일 이름으로 --msa, --model, --tree, --workers 및 --prefix를 입력해야 합니다. 여러 파일을 사용하여 프로세스를 반복해야 합니다. 각 012.laln은 012.model과 일치하고 012-rT라는 출력 파일을 생성해야 합니다. 트리와 워커의 입력 파일은 모든 파일에서 동일합니다.

계속 오류가 발생합니다.

line 2: read: `genefile: ': not a valid identifier
line 3: read: `treefile: ': not a valid identifier
line 4: read: `workers: ': not a valid identifier

사용자 입력 파일 "genelist"의 호출 방식을 여러 가지 방법으로 수정했지만 소용이 없었습니다.

while read -r "${genelist}" ... 
while read -r "${genelist{@}}" ...
while read -r "{genelist}" ...

그 전에는 아래 줄인 for 루프를 사용했습니다. 좋은 결과. 가능하다면 while 루프를 시도해 보고 싶습니다.

for i in $(cat genelist); do for j in $(cat $i.model); do raxml-ng --sitelh --msa $i.laln.trgc38_1l --model $j --tree trees --workers 4 --prefix $i-rT; done; done

질문: 사용자 입력 파일을 while 루프로 호출하는 genelist정확하고 간결한 방법은 무엇입니까 ?

여기에서 몇 가지 예를 찾았지만 루프에서 숫자/숫자 시퀀스를 사용합니다. 대답은 문제를 해결하기 위해 for/while 루프에서 C를 사용하는 것을 제안합니다. 그러나 이것은 내 경우에는 관련이 없는 것 같습니다.

또한 이 경우 for/while 루프에 대한 더 나은 대안도 환영합니다!

답변1

이러한 오류는 루프와 관련이 없습니다. read오류를 사용하고 있습니다 :

$ read -pr "genefile: " genelist
bash: read: `genefile: ': not a valid identifier

-p옵션에는 인수가 필요합니다. 사용하는 경우 r인수로 제공하십시오 -pr. 다음을 수행해야 합니다.

read -p "genefile: " genelist

또는

read -rp "genefile: " genelist

또한, 이는 개인적이긴 하지만 대체로 사실임을 참고하시기 바랍니다. 사용하지 마세요 read! 이는 아무런 이점도 없이 사용자의 생활을 더욱 어렵게 만들 뿐입니다. 이는 입력이 명령의 일부가 아니기 때문에 명령을 다시 실행하기 위해 Readme에 명령을 복사/붙여넣을 수 없음을 의미합니다. 이는 탭 완성 기능을 사용하는 대신 뭔가를 힘들게 입력하라고 요구하기 때문에 제가 작은 실수를 하고 있을 수도 있다는 뜻입니다. 이는 또한 자동화가 어렵다는 것을 의미합니다. 10번 중 9번은 입력을 요청하기 위해 실행을 차단하는 것보다 시작 시 모든 것을 인수로 전달하는 것이 더 좋습니다.

#!/usr/bin/env bash

genelist=$1
trees=$2
workers=$3

while read -r i; do
    while read -r j; do
        raxml-ng --sitelh --msa "$i".laln --model "$j".model --tree "${trees}" --workers "${workers}" --prefix "$i"-rT;
    done < "$i".model; 
done < "$genelist"

그런 다음 다음을 사용하여 스크립트를 시작할 수 있습니다.

script.sh "$genelist" "$trees" "$workers"

관련 정보