Linux

從使用者輸入中讀取帶有前綴列表的文件,然後在 while 循環中呼叫帶有前綴的文件

  • November 17, 2021

我正在嘗試將使用者輸入文件引導到 while 循環中,但在執行腳本時一直失敗。

使用者輸入文件genelist包含我一直用作其他文件前綴的數字列表。例如。012.laln,012.model。

通才:

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

genelist問題:將使用者輸入文件呼叫到 while 循環中的正確且簡潔的方法是什麼?

我在這裡找到了一些範例,但這些範例在循環中使用數字/數字序列。答案建議在 for/while 循環中使用 C 來解決問題。但這似乎與我的情況無關。

同時,在這種情況下,也歡迎任何更好的 for/while 循環替代方案!

這些錯誤與您的循環無關。您使用read錯誤:

$ read -pr "genefile: " genelist
bash: read: `genefile: ': not a valid identifier

-p選項需要一個參數,r如果您使用-pr. 你需要:

read -p "genefile: " genelist

或者

read -rp "genefile: " genelist

另外,一般儘管是個人的,請注意。不要使用read!這只會讓使用者的生活更加困難而沒有任何好處:這意味著我無法將命令複製/粘貼到我的自述文件中以重做它,因為輸入不是命令的一部分。這意味著我可以輕而易舉地打錯字,因為您要求我費力地輸入內容而不是使用製表符補全。這也意味著這很難自動化。十分之九,最好在啟動時將所有內容作為參數傳遞,而不是阻止執行以請求輸入:

#!/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"

引用自:https://unix.stackexchange.com/questions/677801