bash - 未接受的令牌

bash - 未接受的令牌

我正在编写一个 bash 脚本来自动化我的下载过程。在一个部分中,它给出了一个错误:

意外标记“newURL=$(echo $URL | sed 's/&:/$index/')”附近出现语法错误

该部分代码如下:

# Downloading the pdf's.
for index in {$startedNumber..$endedNumber} do
    newURL=$(echo $URL | sed 's/&:/$index/')
    wget $newURL
done

此部分处理类似“http://xxxx.com/xxx/yyy/zzz&:.pdf“并找到“&:”部分。当它找到时,它会将其更改为 $index。这样我就可以下载这些行: http://xxxx.com/xxx/yyy/zzz1.pdf http://xxxx.com/xxx/yyy/zzz2.pdf http://xxxx.com/xxx/yyy/zzz3.pdf http://xxxx.com/xxx/yyy/zzz4.pdf(... 一直到 $endedNumber)

我应该怎么做才能解决这个问题?

答案1

除了当前答案中解决的问题外,这里还有一些问题

  1. bash 不(直接)支持在括号扩展中使用 shell 变量。例如,参见

  2. $index不会扩展,因为您的 sed 表达式是单引号。例如,参见

  3. 避免使用全大写的变量名,并且不要忘记使用双引号括住变量扩展

事实上你根本不需要,sed因为 shell 本身可以直接对变量进行简单的搜索和替换。例如

startedNumber=3; endedNumber=7

url="http://foo&:bar"

for index in $(seq $startedNumber $endedNumber); do 
  echo wget "${url/&:/$index}"
done
wget http://foo3bar
wget http://foo4bar
wget http://foo5bar
wget http://foo6bar
wget http://foo7bar

echo(根据实际情况删除)。

答案2

关键字do应该位于新行上或之后;

从个人经验来看,一般的经验法则是,当报告错误接近意外标记时,请务必查看它之前的代码(不仅仅是在 bash 中)

相关内容