【问题标题】:bash nested variable in for loop [duplicate]for循环中的bash嵌套变量[重复]
【发布时间】:2017-10-10 18:24:21
【问题描述】:

有没有办法做到以下几点?

#!/bin/bash -x

IPFILE_LIST=(
  /copytest/test1
  /copytest/test2/test.conf
  /copytest/test3/test3/test3
  /copytest/test4/test4
)

CopyFunction() {
  for i in "${$1[@]}"; do
    rsync -R $2 $3
  done
}

CopyFunction 'IPFILE_LIST' $i copytestdest

函数最终会是什么样子

CopyFunction() {
   for i in "${IPFILE_LIST[@]}"; do
      rsync -R $i /copytestdest/
   done
}

它会执行rsync数组中的每个项目,最后我应该得到以下输出

copytestdest/copytest/test1 copytest/test2/test.conf copytestdest/copytest/test3/test3/test3 copytestdest/copytest/test4/test4

如果可能的话,我也想在同一个函数中支持跟随,否则它可能需要另一个函数

CopyFunction copytestdest 'IPFILE_LIST'

【问题讨论】:

  • 那是在问“如何在函数中使用数组作为位置参数”,对吧?
  • 我的首选答案是推荐使用 namerefs (local -n),但这需要 Bash 4.3 或更高版本。有关用法示例,另请参阅 Bash hackers wiki
  • 不,我不认为我想要的是将数组作为参数传递,我想循环遍历数组并运行 rsync 命令
  • 看起来您将数组作为参数传递给CopyFunction IPFILE_LISTlocal -n 可以让你做你想做的事。
  • 可以,但这不是我想要的,我希望传递文本“IPFILE_LIST”,然后在 $1 中使用

标签: arrays bash function loops variables


【解决方案1】:

在 bash 4.3 或更新版本中:

CopyFunction() {
  local -n arr=$1
  local i
  for i in "${arr[@]}"; do
    rsync -R "$i" "$2"
  done
}

如果没有现代 bash,您需要使用 eval 转向hackery:

CopyFunction() {
  local -a arr
  local eval_cmd i

  printf -v eval_cmd 'arr=( "${%q[@]}" )' "$1"
  eval "$eval_cmd"

  for i in "${arr[@]}"; do
    rsync -R "$i" "$2"
  done
}

使用其中任何一个,函数都可以调用为:

CopyFunction 'IPFILE_LIST' copytestdest

请注意,在这两种情况下最佳实践是将变量 i 声明为本地变量。因为它是本地的,它的值不会逃避函数调用,所以它的使用没有任何副作用——它在函数退出后不再定义。因为它没有副作用,所以从函数外部控制其名称毫无意义,因此从外部传入该名称也毫无意义。

【讨论】:

  • 有没有办法使用相同的功能进行反向?我希望命令是CopyFunction copytestdest 'IPFILE_LIST' 还是需要一个单独的函数?
  • 如果您只想交换$1$2,那么...只需交换$1$2
  • 我想交换“$i”和“$2”
  • 等一下。你是说你想检测一个参数是否是一个有效的变量名,并根据该确定的结果对源或目标进行迭代?这真的应该是一个单独的问题。 (是的,有可能,但我也将其描述为绝对是个坏主意)。
  • 嗯。特别是对于 rsync ,如果您的函数仅用于远程目标,我想您的非变量参数将始终包含 :/ (两者都不允许使用变量名),因此您可以遍历没有的任何一个(如果两个都没有,则抛出错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多