Bash 스크립트에서 문자열을 연결할 때 한 문자열이 다른 문자열의 일부를 덮어쓰는 이유는 무엇입니까?

Bash 스크립트에서 문자열을 연결할 때 한 문자열이 다른 문자열의 일부를 덮어쓰는 이유는 무엇입니까?

나는 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사용하여 {명령을 그룹화 할 수 있습니다 .}

관련 정보