BASH 从脚本中的 ftp 链接下载基因组序列时的变量解释

BASH variable interpretation when downloading genome sequences from ftp links in a script

我一直在尝试使用 ftp links 按照此处的说明下载基因组序列数据:https://www.ncbi.nlm.nih.gov/genome/doc/ftpfaq/

我在 tsv table 的最后一列中有我的序列的 ftp links,我使用下面的代码从 for 循环的每一行中提取它:

$ ftp=`head -$line_number $input_table | awk -F '\t' '{print $NF}' | tail -1 | sed 's/\"//g'`

末尾的 sed 命令是从输出中删除双引号,否则 wgetrsync 会被解释为字符串的一部分(导致它们失败) .

为了下载每个序列,我将上面 link 中的行添加到循环中(下面的确切代码):

$ wget --recursive --no-host-directories --cut-dirs=6 "${ftp}" -P "new_directory/"

我还尝试使用 https 和 rsync 下载,按照建议通过将 sed 's/ftp/rsync/'sed 's/ftp/https/' 添加到我的 ftp 变量的管道中来更改 link:

$ rsync -rvth --copy-links --prune-empty-dirs "${ftp}" "new_directory/"
$ wget --recursive -e robots=off --reject "index.html" --no-host-directories --cut-dirs=6 "$ftp" -P "new_directory/"

在我的脚本中,这些命令未能找到正确的目录(请参阅下面的错误)。

FTP: $ No such file ‘GCA_000048645.1_ASM4864v1\r’.

RSYNC:rsync: link_stat "/all/GCA/000/048/645/GCA_000048645.1_ASM4864v1\#015" (in genomes) failed: No such file or directory (2)

但是,当我在我的脚本之外尝试时,将每个 link(由脚本中的 $ echo $ftp 行输出)直接输入上面的命令,并且下载成功。输出也匹配原始 table 中的 link(如下例)。

 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/000/048/665/GCA_000048665.1_ASM4866v1

我想一定是我的语法有误,或者 BASH 读取我的变量的方式有误,但我对 BASH 中的变量替换了解不够,无法解决这个问题?谁能告诉我我的问题可能是什么?

注意:我已经尝试将双引号和括号添加到脚本中的所有其他变量(例如上面一行中的 line_number 和输入文件变量)以及这些变量的不同组合,但是徒劳无功。为简单起见,我没有包括我的完整脚本,但我检查了其余部分的错误,问题似乎与 ftp 变量的解释有关,所以我试图包括我所有的代码.感谢您的帮助!

您需要删除回车 return 个字符。替换

sed 's/"//g'

tr -d '"\r'