loop simples não está funcionando

-1

Um script simples

now="$(date +'%d_%m_%Y')"
path="/var/www/vitalii/backups"
sites=("site1.ru site2.ru site3.ru")

for i in ${sites[*]}
do
    echo "$path/$i"
    #tar -cvzf $path/$i_${now}.tgz /var/www/vitalii/$i
done

echo funciona como supostamente, imprime 3 linhas, mas a linha comentada tar não funciona como suposta, cria apenas 1 arquivo, o que está errado? me diga por favor.

    
por user3446561 28.02.2015 / 14:13

2 respostas

2

Além do problema apontado pelo @Cyrus, você está usando a matriz de sites errada. Você está realmente cometendo dois erros que (ironicamente) se anulam mutuamente. Primeiro, quando você define a matriz com sites=("site1.ru site2.ru site3.ru") , as aspas criam um único elemento de matriz, em vez de tornar cada site um elemento separado. Então, quando você faz referência a ${sites[*]} , o [*] faz com que todos os elementos sejam mesclados (separados por espaços) (ou seria, se houvesse mais de um elemento) e, em seguida, a falta de aspas duplas em torno disso significa que ele divide o resultado em espaços (e não entre elementos da matriz) e expande qualquer curinga, etc.

Resultado da rede: você não está recebendo nenhum dos benefícios de usar uma matriz e, se algum dos nomes de sites tiver metacaracteres de shell, você terá ... um comportamento inesperado. Nesse caso, não é provável que cause problemas (os caracteres problemáticos são geralmente proibidos no DNS), mas é melhor aprender a fazer isso corretamente:

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

EDIT: como @ G-Man apontou em outro comentário, usar aspas duplas em torno de todas referências de variáveis é uma boa idéia. Eu consertei isso acima ...

    
por 28.02.2015 / 20:54
1

Substituir

$path/$i_${now}.tgz

por

$path/${i}_${now}.tgz
    
por 28.02.2015 / 14:22