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