從使用者輸入中讀取帶有前綴列表的文件,然後在 while 循環中呼叫帶有前綴的文件
我正在嘗試將使用者輸入文件引導到 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"