一个简单的脚本
现在=“$(日期+'%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