在循环命令期间,下划线 _ 出现在$i之后时出错



我正在尝试从ENA下载一些fastq文件,并希望为我的命令做一个循环。

for (( i = 36; i <= 43; i++ ))
do
wget ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR70591$i/SRR70591$i_1.fastq.gz ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR70591$i/SRR70591$i_2.fastq.gz
done

输出是这样的

--2018-08-19 22:37:14--  http://ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR7059137/SRR70591.fastq.gz
Resolving ftp.sra.ebi.ac.uk (ftp.sra.ebi.ac.uk)... 193.62.192.7
Connecting to ftp.sra.ebi.ac.uk (ftp.sra.ebi.ac.uk)|193.62.192.7|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2018-08-19 22:37:14 ERROR 404: Not Found.

值得注意的是,发生错误是因为

输出SRR70591.fastq.gz中缺少"37_1"。

我尝试了各种迭代,发现如果下划线"_"直接在"$i"命令之后,该命令效果不佳。 你们对如何更改命令以使其工作有任何见解吗?

谢谢大家

您遇到的问题是由于变量'i'后跟一个'_',该可以是变量名称本身的一部分。这会导致无法替换wget命令中同时出现$i_1$i_2i

虽然未标记bash,但以下基本 shell 原则适用。它归结为对单词名称和参数(或变量(定义和要求的基本理解。例如,单词定义为:

word    A sequence of characters considered as a single unit by the shell. 
Also known as a token.

用作名称时,它具有以下定义:

name    A word consisting only of alphanumeric characters and underscores, 
and beginning with an alphabetic character or an underscore. 
Also referred to as an identifier.

(请注意名称定义中如何包含"下划线"。

最后,当名称用作变量或参数时,以下内容适用:

${parameter}
The value of parameter is substituted. The braces are required 
when parameter is a positional parameter with more than one digit, 
or when parameter is followed by a character which is not to be 
interpreted as part of its name... 

(上文">需要大括号">时注意(

将这些部分放在一起,您的循环和wget命令可以修改为:

for (( i = 36; i <= 43; i++ ))
do
wget 
ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR70591$i/SRR70591${i}_1.fastq.gz 
ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR70591$i/SRR70591${i}_2.fastq.gz
done

(注意:如果您不确定是否需要大括号 - 添加它们 - 它们不会造成伤害(

另外,如注释中所述,当您开发和测试脚本时,验证命令是否按预期形成的简单方法是通过首先将命令作为输出回显来简单地进行测试,例如,只需将整个命令括在引号中并echo它,例如

for (( i = 36; i <= 43; i++ ))
do
echo "wget ...your full command..."
done

然后,您可以在 Web 上松散脚本之前验证命令是否按预期形成。

尝试

for (( i = 36; i <= 43; i++ ))
do
line1="ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR70591$i/SRR70591"
line1+=$i 
line1+="_1.fastq.gz"
line2="ftp.sra.ebi.ac.uk/vol1/fastq/SRR705/006/SRR70591$i/SRR70591"
line2+=$i
line2+="_2.fastq.gz"
wget $line1 $line2
done

最新更新