Простой цикл не работает

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

сейчас ="$(дата +'%d_%m_%Y')"
Путь ="/ Var / WWW / виталий / резервное копирование"
sites=("site1.ru site2.ru site3.ru")

для меня в ${сайтов [*]}
делать
    echo "$path/$i"
    #tar -cvzf $path/$i_${now}.tgz /var/www/vitalii/$i
сделанный

echo работает как положено, печатает 3 строки но прокомментировал tar строка не работает как положено, создает только 1 архив, что не так? скажи мне, пожалуйста.

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

Замещать

$path/$i_${now}.tgz

от

$path/${i}_${now}.tgz
Другие вопросы по тегам