我正在尝试做一些我认为相当简单但没有任何快乐的事情。
如果我运行以下命令,它会成功从名为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
关于我哪里出错的指示?
答案 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