如何在bash中引用另一个变量中的变量?

时间:2017-08-10 10:41:40

标签: arrays bash variables for-loop

我正在尝试做一些我认为相当简单但没有任何快乐的事情。

如果我运行以下命令,它会成功从名为PORT330的数组中拉出区域(reg)并检查它是否包含$ i的值。例如,它可以检查是否"欧洲伦敦"包含“"伦敦"”这个词。这是有效的:

if [[ ${PORT330[reg]} == *"$i"* ]] ; then 
   echo 302 is in $i ; 
fi

但是,我实际上有一个端口阵列列表要检查,所以它可能是PORT330,PORT550等等。我希望能够用变量替换端口号,然后在变量中调用它。这是我想要做的:

这有效:

for portid in ${portids[@]} ; do 
  for i in ${regions[@]} ; do 
    if [[ ${PORT330[reg]} == *"$i"* ]] ; then 
      echo $portid is in $i ; 
    fi  ;
  done ; 
done

然而,这不起作用:

for portid in ${portids[@]} ; do 
  for i in ${regions[@]} ; do 
    if [[ ${PORT$portid[reg]} == *"$i"* ]] ; then 
      echo $portid is in $i ; 
    fi  ; 
  done ; 
done

它抛出了这个错误:

-su: ${PORT$portid[reg]}: bad substitution

关于我哪里出错的指示?

1 个答案:

答案 0 :(得分:1)

在BASH变量扩展中,有一个通过${!name}${!name[index]}方案进行间接寻找的选项

for portid in ${portids[@]} ; do 
   for i in ${regions[@]} ; do 
      arr=PORT$portid
      if [[ ${!arr[reg]} == *"$i"* ]] ; then 
          echo $portid is in $i ; 
      fi  ; 
    done ; 
done

这是一个完整的例子

PORT330[reg]=a ; 
PORT550[reg]=b ; 
for portid in 330 550 ; do 
   for i in a b ; 
       do arr=PORT$portid ; 
       if [[ ${!arr[reg]} == *"$i"* ]] ; then 
           echo $portid is in $i ; 
       fi  ; 
   done ; 
done

制作

330 is in a
550 is in b

另一个例子

:~> portids=(330 350 )
:~> echo ${portids[@]}
330 350
:~> PORT350[reg]=London
:~> PORT330[reg]=Berlin
:~> for portid in ${portids[@]} ; do arr=PORT$portid ; echo ${!arr[reg]} ; done
Berlin
London