2014-12-29 3 views
1

Я пытаюсь сделать сценарий резервного копирования для моих сайтов, но я имею проблемы с вложенным для циклаВложенная петля с приращением на внутренний цикл?

BACKUP_DIR="/path/to/output" 
WEB_DIR="/srv/http" 
WEBSITES=($WEB_DIR/website_one $WEB_DIR/website_two) 
MYSQLDBS=(database_one database_two) 

for WEBSITEBACKUP in $WEBSITES 
do 
    # tar commands here for website directories 

    for DATABASEBACKUP in $MYSQLDBS 
    do 
     # mysql dump commands here for databases 
     break 
    done 
done 

Я надеялся, что петля 1 будет резервную копию веб-сайта, а затем открыть контур 2, который будет создать резервную копию базы данных затем вырваться из внутреннего цикла и продолжить резервное копирование веб-сайта 2, но как только он попадает во внутренний цикл, второй раз он снова создает резервную копию первой базы данных.

Мой вопрос: как я могу получить вложенный цикл для увеличения, пока все базы данных в массиве не будут успешно скопированы, или есть другой способ, который я упустил?



Для тех, кто интересно, причины, почему базы данных не подкреплены в своем собственном цикл, потому что я получаю имя папки от $ WEBSITEBACKUP и я хотел бы магазин базы данных в тот же каталог, что и их веб-сайт.

CURRENT_BACKUP=`echo $WEBSITEBACKUP | sed "s|\$WEB_DIR||g" | tr "/" "-" | cut -b2-` 
+0

Если вы хотите сделать резервную копию WEBSITE1 + DB1 затем website2 + db2, лучше иметь один цикл, который делает оба (итерация по индексу массива). – eckes

+0

Я использую два массива для веб-сайтов, а один для баз данных - причина, по которой у меня было две петли, поэтому я мог бы перебирать массивы, но я думаю, что я просто ответил на свой вопрос, если бы я должен был сделать для WEBSITEBACKUP в $ WEBSITES $ MYSQLDBS i мог бы сделать echo {$ WEBSITEBACKUP [1]} и echo {$ WEBSITEBACKUP [2]}, чтобы получить имя сайта и имя базы данных на каждом проходе? – Michael

+0

Да, вы также можете использовать цикл над одним массивом и сдвигать каждый параметр, но для двух массивов см. Мой ответ. – eckes

ответ

1

См. here для перебора ключей массива. Таким образом, вам не нужно встраивать петли: $i будет перебирать более 0 1 2, вам просто нужно убедиться, что оба массива имеют одинаковое количество элементов.

#/bin/bash 
WEBSITES=(A B C) 
DATABASES=(X Y Z) 

echo "debug: ${!WEBSITES[@]}" 
for i in "${!WEBSITES[@]}"; do 
    site=${WEBSITES[$i]} 
    db=${DATABASES[$i]} 
    echo tar $site 
    echo mysqldump $db 
done 

приводит:

debug: 0 1 2 
tar A 
mysqldump X 
tar B 
mysqldump Y 
tar C 
mysqldump Z 
+1

Большое спасибо, друг! У меня много головных болей – Michael