【问题标题】:Passing two array variables into single loop将两个数组变量传递到单个循环中
【发布时间】:2014-04-30 09:02:59
【问题描述】:

我已经在这里搜索并搜索了答案,我认为作为 bash 的菜鸟、不知道正确的方法以及不搜索正确的关键字的组合意味着我不能克服最后的障碍。

我正在编写一个基本的 bash 脚本,以根据逗号分隔数组变量的内容将配置行创建到文件中。它非常适用于单个变量,但是当我尝试组合两个数组变量时,它并不完全有效。我试过在循环内循环,当我希望它与它创建的其他 5 行循环时,它只是一个接一个地创建行。

这两个变量的迭代次数相同。例如:

  • arr1=SITENAME1,SITENAME2,SITENAME3
  • arr2=12:ac:23:bf:12:ca,22:de:a2:bf:21:ac,01:e4:32:f0:12:c4

我想将它们一起传递到循环中:

  • SITENAME1 ($y) 和 12:ac:23:bf:12:ca ($x)
  • SITENAME2 ($y) 与 22:de:a2:bf:21:ac ($x)
  • SITENAME3 ($y) 与 01:e4:32:f0:12:c4 ($x)

这里是代码摘录:

arr1=$(echo $sites | tr "," "\n")
arr2=$(echo $mastermacs | tr "," "\n")
IFS="," read -a arr1 <<< "$sites"
IFS="," read -a arr2 <<< "$mastermacs"
for y in "${!arr1[@]}"; do
#    for x in "${arr2[@]}"; do
  n=$(($n+1))
  echo "config flexconnect group ${arr1[y]} add"$'\r' >> Flex-cfg.txt
  echo "config flexconnect group ${arr1[y]} ap add ${arr2[x]} "$'\r' >> Flex-cfg.txt
  echo "config flexconnect group ${arr1[y]} predownload master ${arr1[y]}_AP01"$'\r' >> Flex-cfg.txt
  echo "config flexconnect group ${arr1[y]} predownload enable"$'\r' >> Flex-cfg.txt
  echo "config flexconnect group ${arr1[y]} predownload start primary"$'\r' >> Flex-cfg.txt
 #    done
 done

尤其是这一行,我正在尝试使用 2 个值进行迭代(顺便说一下,我只使用了 $y 和 $x,我只是在修修补补):

echo "config flexconnect group ${arr1[y]} ap add ${arr2[x]} "$'\r' >> Flex-cfg.txt

但就目前而言,它每次只放置第一个。值 Y 是名称,值 X 是 MAC 地址。

我要么非常接近,要么完全完全错误。所以可以通过一些善意的帮助来做!

【问题讨论】:

  • 你能展示一下 arr1 和 arr2 里面的内容吗?
  • arr1 只是一串 alpha 字符。 arr2 是 MAC 地址。
  • 这段代码的一个问题是arr1 和arr2 实际上不是数组;它们只是带有嵌入换行符的字符串。 arr1=( $(echo $sites | tr "," "\n") ) 会更正确(尽管不完全正确)。 (虽然下面的read 语句覆盖了arr1 的值,所以初始赋值没有实际意义。)
  • 感谢 chepner。是的,那里可能有一些奇怪的线条,因为我已经切碎并改变了一点。 tr "," 与 IFS 行相同。我的主要问题是我无法让两个变量并行循环在一起......

标签: arrays bash variables multiple-value


【解决方案1】:
IFS=, read -a sz <<< "$sites"
IFS=, read -a mz <<< "$mastermacs"
fx='config flexconnect group'
for x in ${!sz[*]}
do
  echo "$fx ${sz[x]} add"
  echo "$fx ${sz[x]} ap add ${mz[x]}"
  echo "$fx ${sz[x]} predownload master ${sz[x]}_AP01"
  echo "$fx ${sz[x]} predownload enable"
  echo "$fx ${sz[x]} predownload start primary"
  echo
done
  • 不要使用arr1。如果您的变量,您可能会很快迷失在代码中 名字没有意义

  • 我添加了额外的空echo,以提高输出的可读性

【讨论】:

  • 感谢 Steven 的及时回复。我想要实现的是一起循环浏览每个站点和 MAC。即:$sites 中的第一个是 $mastermacs 中第一个 MAC 的一个循环。 $sites 中的第二个是 $mastermacs 等中的第二个循环。可能有更好的方法,但我对这些东西很陌生,所以有点像盲人摸索他的拐杖......
  • 对不起,史蒂文,我应该提到的,不完全是。就像我使用两个循环一样,它为 $sites 中的每个单个站点重复 $mastermac 中的所有 MAC。我正在尝试做的是将每个站点与每个 MAC 对齐。
  • 是的,这两个变量的迭代次数相同。我已经更新了我的解释,如果不清楚,请道歉。
  • 很棒的史蒂文。效果很好,谢谢!我似乎离得不远,这给了我一点信心! :)
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2023-03-17
  • 2019-07-30
  • 2019-01-14
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多