运行以下脚本时我收到此错误
错误
mus.sh: 8: mus.sh: Syntax error: word unexpected (expecting "do")
脚本
#!/bin/bash
versions='57.0 58.0.1'
platforms='win64 win32'
locales='en-US es-ES'
for i in ${versions[@]}
do
for p in ${platforms[@]}
do
for l in ${locales[@]}
do
wget -c -A.mar "http://download.cdn.mozilla.net/pub/firefox/releases/"$i"/update/"$p"/"$l"/"
done
done
done
答案1
versions
我无法重现您的错误,但脚本完全不正确。不正确的部分是、platforms
、的值的分配locales
- 目前这些是变量,而不是数组。以下是一个例子:
$ versions='57.0 58.0.1'
$ printf '%s\n' "${versions[@]}"
57.0 58.0.1
构建的方法之一Bash 中的数组, 作为@甜点表示,使用圆括号。最常见的是:
- 定义一个空数组:
array=()
, - 定义一个数组并赋值:
array=('element 0' 'element 1')
, - 将元素添加到预定义数组:
array+=('element 2' 'element 3')
, - 替换某个元素的值(本例中为第一个元素)
array[0]='new value'
:, - 在这种情况下引号由于值中有空格,所以是绝对强制性的。
以下是使用数组时上图的结果:
$ unset versions
$ versions=('57.0' '58.0.1')
$ printf '%s\n' "${versions[@]}"
57.0
58.0.1
据此,您的脚本应如下所示:
#!/bin/bash
versions=('57.0' '58.0.1')
platforms=('win64' 'win32')
locales=('en-US' 'es-ES')
for i in "${versions[@]}"
do
for p in "${platforms[@]}"
do
for l in "${locales[@]}"
do
echo "$i : $p : $l"
done
done
done
另一个小错误是你的wget
表达方式。引用整个 url 更好或更简单。使用括号将变量与字符串的其余部分分开:
wget -c -A.mar "http://.../releases/${i}/update/${p}/${l}/"