【问题标题】:Defining an array from concatenated variables in bash从 bash 中的连接变量定义数组
【发布时间】:2014-04-19 01:32:56
【问题描述】:

在我在下面发布的代码之外,我定义了一个数组 fanrp0[1] 和 fanrp0[2] 我对风扇 0 到 3 做了同样的事情。我正在尝试改变 fstat 并在两个数组中回显每个风扇.

    for (( f=1; f<=2; f++ ))
     do
       for (( f2=0; f2<=3; f2++ ))
        do
          fstat="${(fanrp$f2)[$f]}"
          echo $fstat
        done
     done

【问题讨论】:

  • 问题出在哪里?
  • 看起来你正在尝试做 bash 所指的间接引用,这对于数组变量来说显然相当困难和繁琐,从 this Bash FAQ page 判断,我在 @ 上找到的987654322@。您可以使用eval 有点 更轻松地完成您需要的事情,就像在eval "fstat=\${fanrp$f2[$f]}" 中一样,但请记住,使用eval 存在一些安全问题。我会先阅读我链接到的那个 Bash FAQ 页面。
  • 一旦你开始考虑[...] 不是索引语法,而是作为变量名称的一部分,间接数组引用会更容易。如果您有一个数组foo,那么foo[0]foo[1] 等只是奇怪命名的变量,每个都有自己的值。然后x=foo[0] 自然导致${!x} 等价于${foo[0]}

标签: arrays bash variables concatenation


【解决方案1】:

如果fanrp0fanrp1fanrp2fanrp3 都是数组,则可以将循环编写为

for (( f=1; f<=2; f++ ))
do
  for (( f2=0; f2<=3; f2++ ))
  do
    x="fanrp$f2[$f]"
    fstat="${!x}"
    echo $fstat
  done
done

由于f2 仅用于生成数组名称,因此语法会更简洁

for f in {1..2}; do
  for arr in fanrp{0..3}; do
    x="$arr[$f]"
    fstat=${!x}
    echo $fstat
  done
done

【讨论】:

  • 第一个选项实际上给了我一个糟糕的替代错误,这是我第一次尝试时写的,我不知道为什么会出现这个错误。但是,我认为您的第二个解决方案对我来说更有意义,谢谢它效果很好我不知道 for arr
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
相关资源
最近更新 更多