我有一个共享备份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

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

1回复

bash for循环中的嵌套变量[重复]

这个问题已经在这里有了答案: 在bash中将数组作为参数传递 13个答案 有什么方法可以执行以下操作? #!/bin/bash -x IPFILE_LIST=( /copytest/test1 /copytest/test2/test.conf /c
2回复

使用函数和if语句在Bash脚本中无休止的循环[关闭]

试图了解这里发生了什么,为什么? 首先调用名为“ why”的函数,然后再调用该函数或完全退出。 预期的结果永远无法在if语句下运行循环,该语句可以是if-else-fi语句,也可以是if-elif-else-fi,并不重要。 问题是为什么回声结束? 我不明白为什么最后一次回声
2回复

从bash中的循环创建多个全局变量

这个问题已经在这里有了答案: bash中的间接变量赋值 6个答案 Bash中的动态变量名称 12答案 因此,我有一个循环,该循环基本上遍历了系统上安装的所有磁盘,然后为磁盘名称分配了一个变量。 但是,如果不在循环内,则不能使用这些变量,如何使它们可用于其
2回复

在Bash的while循环头中测试函数的返回值

我有一个bash函数,如下所示: 我调用该函数的代码如下: 这可以正常工作,但是非常笨拙-可以将其替换为以下内容-引发语法错误 我也尝试过
1回复

bash在变量中扩展变量,前缀为$

我正在使用bash函数,并且怀疑它当前存在语法错误,代码如下: 我想要做的是为第一个参数运行GET_BLOCK“ / $ 1 /”,为第二个参数运行“ / $ 2 /”,依此类推,直到没有更多参数传递给脚本。 我这样做对吗? (PS!我需要获取变量$ 1,$ 2的值...)
1回复

将结果从查找传递到自定义bash函数?

我有一个自定义的bash测试功能 我想称其为: 但它只是回显列表中传递的第一个文件。 find . -name hello的原始输出find . -name hello find . -name hello是 如何确保整个列表都通过了? 谢谢!
1回复

为什么bash函数的结果取决于调用该函数的范围? [重复]

这个问题已经在这里有了答案: bash:从管道分配变量? 5个答案 我的bash脚本之一有问题。 我有一个变量和一个定义的函数,有些超级简单: 我调用此addResult函数并检查$RESULT变量,可以看到它已更改,并且json增长了。 但是,我
2回复

Bash数组作为屏幕内部的参数

以下代码无法正常运行。 我可能是因为我做错了所有事情,但我认为这可能是一个报价问题。 我认为我引用的内容不正确,因为当我尝试执行此操作时。 我知道了 本质上,我正在尝试添加此功能(有效) 到此屏幕一班轮 然后让它循环数组 所以我不确定(在代码中)我要去
1回复

如何并行化循环? (fasta文件)

我编写了一个脚本来更改一个文本文件(fasta格式)中的特定行,并且我想并行化,因为其中有很多行(〜800k)。 我想将其转换为: 我有两个问题。 我尝试在有功能和无功能的情况下运行脚本: 没有功能,它将起作用:我要更改的所有行均已修改。
1回复

bash-在循环中运行.sh

嘿,我有循环,我需要运行选定的文件,但我不知道如何从不同目录运行sh文件?