我有一个共享备份bash脚本,它按原样工作,但它使用几行来做一些可以循环的东西(我希望)。我认为它可以好得多,在我看来,第一步是使用循环来循环共享。
在它的scurrent状态中,脚本我调用了三个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指出的那样。
再次感谢。
答案 0 :(得分:3)
只要您的路径中没有空格,此方法就可以正常工作:
for pair in "share1_var log1_var" "share2_var log2_var"
do
set -- $pair
share_var = $1
log_var = $2
create_log_dir "$share_var"
create_log "$share_var" "$log_var"
create_rsync_cmd "$log_var"
done
答案 1 :(得分:2)
使用阵列怎么样?即使您的值包含空格,它仍然有效。
array=("share1" "log1"
"share2" "log2")
for ((i=0; i<${#array[@]}; i+=2)) ; do
share_var=${array[i]}
log_var=${array[i+1]}
create_log_dir "$share_var"
create_log "$share_var" "$log_var"
create_rsync_cmd "$log_var"
done