【问题标题】:Nested Loop with increment on inner loop?内循环有增量的嵌套循环?
【发布时间】:2014-12-29 23:30:34
【问题描述】:

我正在尝试为我的网站制作备份脚本,但我遇到了嵌套 for 循环的问题

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,但是一旦它第二次返回到内部 for 循环,它就会返回再次启动第一个数据库。

我的问题是,我怎样才能让嵌套循环递增,直到阵列中的所有数据库都已成功备份,或者还有其他我忽略的方法?



对于任何想知道的人,数据库没有在自己的 for 循环中备份的原因是因为我从 $WEBSITEBACKUP 获取文件夹名称,并且我希望将数据库存储在与其网站相同的目录中。

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

【问题讨论】:

  • 如果你想备份 website1+db1 然后 website2+db2 最好有一个单独的循环来做这两个(遍历数组索引)。
  • 我使用两个数组,一个用于网站,一个用于数据库,我有两个循环的原因是我可以循环遍历数组,但我想我只是回答了我自己的问题,如果我要这样做的话$WEBSITES $MYSQLDBS 中的 WEBSITEBACKUP 我可以执行 echo {$WEBSITEBACKUP[1]} 和 echo {$WEBSITEBACKUP[2]} 以在每次传递时获取网站目录和数据库名称?
  • 是的,您也可以在单个数组上使用循环并移动每个参数,但对于两个数组,请参阅我的答案。

标签: bash loops for-loop backup database-backups


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2021-05-30
    • 2022-08-07
    • 2020-08-05
    相关资源
    最近更新 更多