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
echo
działa jak należy, drukuje 3 linie, ale linia z komentarzem tar
nie działa tak, jak powinna, tworzy tylko 1 archiwum, co jest nie tak? Powiedz mi proszę.
linux
bash
bash-scripting
użytkownik3446561
źródło
źródło
.tgz
). To znacznie ułatwi to rozgryźć.%Y_%m_%d
formatów podobnych do nazw plików, więc porządek sortowania leksykograficznego (alfanumeryczny) zapewnia sortowanie chronologiczne.Odpowiedzi:
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:
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 ...
źródło
Zastąpić
przez
źródło
${i}
Nie używaj{$i}
.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
.