나는 bash 스크립트를 사용하여 IDlist.txt라는 파일에 이름이 지정된 유전자 목록에서 프로그램을 실행하고 있습니다. IDlist.txt를 배열로 읽은 후 배열을 반복하고 각 유전자에 대해 명령을 한 번씩 실행해 보았습니다. 이를 위해서는 경로를 유전자 이름(IDlist[i]) 및 파일 확장자(.fas)와 연결해야 합니다.
내 코드는 다음과 같습니다
#!/bin/bash
## This declares IDlist and reads each line in the file into the array
declare -a IDlist
n=0
while read line
do
IDlist[n]=${line}
n=${n}+1
done < "IDlist.txt"
##Then I loop through IDlist
for i in ${IDlist[@]}
do
echo $i
path1="/path/to/geneTrees/63mammnt/trimallcds_wSpalax/newFasta/${i}.fas"
echo $path1
path2="/path/to/geneTrees/masterTrees/master.$i.tre"
##This is the command
(echo 1; echo ${path1}; echo ${path1}; echo ${path2}; echo 2; echo 2) | /path/to/program/hyphy/HYPHYMP /path/to/program/hyphy/build/lib/hyphy/TemplateBatchFiles/SelectionAnalyses/RELAX.bf
done
"echo $i"의 출력은 정확하지만 "echo $path1"의 출력은 올바르지 않습니다. $i = CRIPT의 경우 $path1은 .fas1/to/geneTrees/63mammnt/trimalcds_wSpalax/newFasta/CRIPT입니다.
.fas는 문자열의 시작 부분에 추가되며(끝 부분에 추가하더라도) 경로의 첫 번째 폴더에 씁니다. 스크립트 없이 이러한 명령을 실행하면 이런 일이 발생하지 않습니다.
답변1
몇 가지 팁:
dos2unix
파일을 Unix 개행 문자로 변환하는 데 사용됩니다 . 덮어쓰기처럼 보이는 것은 실제로는 캐리지 리턴 문자입니다.보여주다이 값은 커서를 줄의 시작 부분으로 이동한다는 특별한 의미를 갖습니다.- 파일을 배열로 읽는 가장 쉬운 방법은
readarray
. - 더 많은 인용문 사용™
- 결과를 실행해 보세요.
shellcheck
더 많은 팁을 보려면 스크립트가 통과된 후 다음을 수행하세요.검토를 위해 게시. - 서브쉘 생성을 방지하기 위해 및 를
echo
사용하여{
명령을 그룹화 할 수 있습니다 .}