ユーザー入力からプレフィックスリストを含むファイルを読み取り、whileループでプレフィックスを使用してファイルを呼び出します。

ユーザー入力からプレフィックスリストを含むファイルを読み取り、whileループでプレフィックスを使用してファイルを呼び出します。

ユーザー入力ファイルを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

Q:ユーザー入力ファイルを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"

おすすめ記事