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使用して{コマンドをグループ化できます。}

関連情報