简单循环不起作用

简单循环不起作用

一个简单的脚本

现在=“$(日期+'%d_%m_%Y')”
路径=“/var/www/vitalii/backups”
站点=(“站点1.ru 站点2.ru 站点3.ru”)

对于我在 ${sites[*]}
    回显“$path/$i”
    #tar -cvzf $path/$i_${now}.tgz /var/www/vitalii/$i
完毕

echo可以按预期工作,打印 3 行,但注释tar行不能按预期工作,只创建 1 个档案,哪里出了问题?请告诉我。

答案1

除了 @Cyrus 指出的问题之外,您错误地使用了 sites 数组。实际上,您犯了两个错误,但讽刺的是,这两个错误大部分互相抵消。首先,当您使用 定义数组时sites=("site1.ru site2.ru site3.ru"),引号会使其创建一个数组元素,而不是使每个站点成为单独的元素。然后,当您使用 引用它时${sites[*]}[*]会使它将所有元素混合在一起(用空格分隔)(或者,如果有多个元素,它会这样做),然后缺少双引号意味着它会在空格上拆分结果(而不是在数组元素之间),并扩展任何通配符等。

最终结果:您无法获得使用数组的任何好处,并且如果任何站点名称中包含 shell 元字符,您将遇到...意外...行为。在这种情况下,它不太可能造成麻烦(有问题的字符通常在 DNS 中是被禁止的),但最好学会正确地做到这一点:

now="$(date +'%d_%m_%Y')"
path="/var/www/vitalii/backups"
sites=(site1.ru site2.ru site3.ru)  # If any elements had spaces or other funny characters, you'd need to quote them INDIVIDUALLY

for i in "${sites[@]}"  # Double-quotes and [@] make it treat each element as a "word", even if they contain funny characters
do
    echo "$path/$i"
    tar -cvzf "$path/${i}_${now}.tgz" "/var/www/vitalii/$i"  # ${i}_ keeps it from treating "_" as part of the variable name
done

编辑:正如@G-Man在另一条评论中指出的那样,使用双引号全部变量引用是个好主意。我已经在上面修复了这个问题...

答案2

代替

$path/$i_${now}.tgz

经过

$path/${i}_${now}.tgz

相关内容