【发布时间】:2012-01-17 23:42:16
【问题描述】:
我有一个按原样工作的共享备份 bash 脚本,但它使用几行来执行可以循环的操作(我希望如此)。我认为它可以更好,在我看来,第一步是使用循环来循环共享。
在当前状态下,我拥有的脚本为每个共享调用三个 bash 函数和一个 python 脚本(使用 stderr 和 stdout 发送电子邮件),其中有几个(现在 4 个,可能多达 6-8 个) ,它看起来像这样:
create_log_dir "$share1_backup"
create_log "$share1_backup" "$log_file"
create_rsync_cmd "$log_file"
python backup.py $email_address \
"$rsync_command $rsync_args $share1 $share1_backup"
因此,上面的代码对于所有共享来说大概是 20-30 行。我希望为每个看起来像这样的共享(类似伪代码的示例)创建一个遍历这些步骤的循环:
for var in list (each $share_var and $log_var)
do
create_log_dir "$share_var"
create_log "$share_var" "$log_var"
create_rsync_cmd "$log_var"
done
我用一些 bash 选项尝试了这种格式,但无法正常工作。对 bash 来说还是新手,所以我希望能从中学到一些很酷的技巧。
提前致谢。
更新编辑
这里是路径和日志变量以及我正在使用的 for 循环:
#variables
share1="/path/to/share/"
share1_backup="/path/to/share/backup"
# log creation
# If the 'rsync_logs' directory in destination doesn't exist, create it.
create_log_dir()
{
backup_dest=$1
if [ ! -d "$backup_dest/rsync_logs" ]
then
mkdir $backup_dest/rsync_logs
fi
}
# Check for log_file existence; append '_alt' if exists.
create_log()
{
backup_dest=$1
log_file=$2
log_file="$backup_dest/rsync_logs/$(date +"%Y-%m%d")_rsync_output.log"
if [ -f $log_file ]
then
log_file="${log_file}_alt"
fi
}
#loop
for pair in "share1_backup log_file"
do
set -- $pair
share=$1
log=$2
create_log_dir "$share"
create_log "$share" "$log"
create_rsync_cmd "$log"
done
所以我用原来的答案试了一下:
for pair in "share1_backup log_file"
并且...使用变量方法(似乎都不起作用 - 第一个给出错误,因为目录 share1_backup/rsync_logs 不存在 - 它没有使用变量):
for pair in "${share1_backup} ${log_file}"
第二个导致空日志文件。
更新编辑 2
我认为更好的方法是在其他地方构建日志,以便下面的两个答案都有效。我最初认为将它们保存在备份目标中会很好,但话又说回来,最好将日志保存在安装了所有共享的机器上,以保持一致性。然后,如果我必须将它们放在目标驱动器上,我可以编写一个定期复制它们的脚本。这样,我可以提前构建 log_file 变量,然后在循环中使用它,正如 David K. Hess 指出的那样。
再次感谢。
【问题讨论】:
-
你用什么
list? -
嗯,列表将是我的共享列表和日志变量。但它不一定是一个列表,我猜。不确定这是否是最好的方法???
-
在您最新的脚本中,在第一种使用文字的情况下,它将使用这些确切的值作为您的函数的参数(这不是我认为您想要的)。在第二种情况下,您没有在 for 循环执行之前初始化“log_file”变量。
-
嗯,我明白你的意思了……基于此,看来这个想法可能根本行不通;或者,至少,不像我想象的那样。我想我需要摆弄一些其他的想法。非常感谢您的帮助。