从用户输入中读取带有前缀列表的文件,然后在 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

问题: 将用户输入文件调用genelist到 while 循环中的正确且简洁的方法是什么?

我在这里找到了一些示例,但它们在循环中使用数字/数字序列。答案建议在 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!这只会让用户的生活变得更加困难,而没有任何好处:这意味着我无法将命令复制/粘贴到我的自述文件中以重做它,因为输入不是命令的一部分。这意味着我可能会犯一个小错误,因为你要求我费力地输入内容而不是使用制表符完成。这也意味着这很难自动化。十有八九,最好在启动时将所有内容作为参数传递,而不是阻止执行以请求输入:

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

相关内容