-1

Простой скрипт

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 работает как положено, печатает 3 строки, но закомментированная строка tar не работает как положено, создает только 1 архив, что не так? скажи мне, пожалуйста.

2 ответа2

2

В дополнение к проблеме, которую указал @Cyrus, вы неправильно используете массив sites. Вы на самом деле делаете две ошибки, которые (по иронии судьбы) в основном компенсируют друг друга. Во-первых, когда вы определяете массив с sites=("site1.ru site2.ru site3.ru") , кавычки заставляют его создавать отдельный элемент массива, а не превращать каждый сайт в отдельный элемент. Затем, когда вы ссылаетесь на него с помощью ${sites[*]} , [*] заставляет его объединять все элементы вместе (разделенные пробелами) (или это было бы, если бы было более одного элемента), а затем отсутствовал двойных кавычек, что означает, что он разделяет результат по пробелам (а не между элементами массива) и расширяет любые символы подстановки и т. д.

Итоговый результат: вы не получаете никаких преимуществ от использования массива, и если у какого-либо из имен сайтов есть метасимволы оболочки, у вас будет ... неожиданное ... поведение. В этом случае это вряд ли вызовет проблемы (проблемные символы вообще запрещены в 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 в другом комментарии, использование двойных кавычек вокруг всех ссылок на переменные является хорошей идеей. Я исправил это выше ...

1

замещать

$path/$i_${now}.tgz

от

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .