我有一个共享备份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指出的那样在循环中使用它。

再次感谢。

===============>>#1 票数: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

===============>>#2 票数: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

  ask by nicorellius translate from so

未解决问题?本站智能推荐: