prosta pętla nie działa

-1

Prosty skrypt

teraz = "$ (data + '% d_% m_% Y')"
ścieżka = "/ var / www / vitalii / backups"
witryn = („site1.ru site2.ru site3.ru”)

dla i w $ {witrynach [*]}
zrobić
    echo „$ path / $ i”
    #tar -cvzf $ path / $ i _ $ {now} .tgz / var / www / vitalii / $ i
gotowy

echodziała jak należy, drukuje 3 linie, ale linia z komentarzem tarnie działa tak, jak powinna, tworzy tylko 1 archiwum, co jest nie tak? Powiedz mi proszę.

użytkownik3446561
źródło
1
Spójrz na: Jak debugować skrypt bash? .
Cyrus
1
Odpowiedź Cyrusa wydaje się być rozwiązaniem, którego potrzebujesz. Ale następnym razem, gdy pojawi się taka sytuacja, powiedz nam nazwę jednego utworzonego archiwum (tj. (Data) .tgz ). To znacznie ułatwi to rozgryźć.
G-Man
Aha, możesz też rozważyć użycie %Y_%m_%dformatów podobnych do nazw plików, więc porządek sortowania leksykograficznego (alfanumeryczny) zapewnia sortowanie chronologiczne.
G-Man

Odpowiedzi:

2

Oprócz wskazanego przez @Cyrus problemu niewłaściwie używasz tablicy witryn. W rzeczywistości popełniasz dwa błędy, które (jak na ironię) w większości się znoszą. Po pierwsze, gdy definiujesz tablicę za pomocą sites=("site1.ru site2.ru site3.ru"), cudzysłowy sprawiają, że tworzy on pojedynczy element tablicy, zamiast uczynić każdą stronę osobnym elementem. Następnie, kiedy odwołujesz się do niego ${sites[*]}, [*]sprawia, że ​​łączy on wszystkie elementy razem (oddzielone spacjami) (lub byłoby, gdyby istniał więcej niż jeden element), a następnie brak podwójnych cudzysłowów, co oznacza, że ​​dzieli wynik na spacjach (a nie między elementami tablicy) i rozwija dowolne symbole wieloznaczne itp.

Wynik netto: nie zyskujesz żadnej korzyści z używania tablicy, a jeśli którakolwiek z nazw witryn zawiera metaznaki powłoki, miałbyś ... nieoczekiwane ... zachowanie. W takim przypadku prawdopodobnie nie spowoduje to problemów (w DNS i tak problematyczne postacie są ogólnie zabronione), ale lepiej nauczyć się robić to dobrze:

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

EDYCJA: jak zauważył @ G-Man w innym komentarzu, dobrym pomysłem jest stosowanie cudzysłowów wokół wszystkich odniesień zmiennych. Naprawiłem to powyżej ...

Gordon Davisson
źródło
1

Zastąpić

$path/$i_${now}.tgz

przez

$path/${i}_${now}.tgz
Cyrus
źródło
tworzy teraz 3 archiwa, ale nazwy plików to {site1.ru} _28_02_2015.tgz {site2.ru} _28_02_2015.tgz ...
użytkownik3446561
2
${i}Nie używaj {$i}.
Cyrus
2
Ponadto, chociaż w tym przypadku może to nie mieć znaczenia, ogólną zasadą jest, że wszystkie słowa zawierające zmienne powinny być cytowane; np tar -cvzf "$path/${i}_${now}.tgz" "/var/www/vitalii/$i". Również w tym przypadku ${now}nie potrzebuje nawiasów klamrowych i może być $now.
G-Man