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

时间:2018-08-20 02:46:23

标签: linux shell

我正在尝试从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.

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

输出37_1中缺少

SRR70591.fastq.gz”。

我尝试了的各种迭代,发现如果下划线“ _”紧接在“ $i”命令之后,该命令将无法正常工作。 你们对我如何更改命令以使其起作用有任何见解?

谢谢大家

2 个答案:

答案 0 :(得分:1)

您遇到的问题是由于变量'i'后跟'_',后者可能是变量名称本身的一部分。这会导致无法替换i中同时出现$i_1$i_2的{​​{1}}。

尽管未标记 bash ,但以下基本Shell主体适用。它归结为对单词名称参数(或变量)的定义和要求的基本理解。例如,单词定义为:

wget

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

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

然后您可以在将脚本放到网络上之前验证命令的格式是否正确。

答案 1 :(得分:0)

尝试

    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