Bash脚本 - 在循环中运行带变量的函数

时间:2011-12-11 18:54:29

标签: bash function loops

我有一个共享备份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指出的那样。

再次感谢。

2 个答案:

答案 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