사용자 입력 파일을 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"