我正在使用 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
使用{
和对命令进行分组,}
以避免创建子 shell。