我正在编写一个 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
除了当前答案中解决的问题外,这里还有一些问题
bash 不(直接)支持在括号扩展中使用 shell 变量。例如,参见
$index
不会扩展,因为您的 sed 表达式是单引号。例如,参见避免使用全大写的变量名,并且不要忘记使用双引号括住变量扩展
事实上你根本不需要,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 中)