为什么在 bash 脚本中连接字符串时,一个字符串会覆盖另一个字符串的一部分?

为什么在 bash 脚本中连接字符串时,一个字符串会覆盖另一个字符串的一部分?

我正在使用 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。

相关内容