动态引用数组

时间:2013-12-13 16:49:17

标签: bash

#!/bin/sh -x

GRADES=(FIRST SECOND)
FIRST_GRADE=(JOHN MICHAEL)
SECOND_GRADE=(MARY SUSAN)

for grade in "${GRADES[@]}"
do
   echo $grade
   for name in "${$grade_GRADE[@]}"
   do
      echo "...$name"
   done
done

但我得到./miniPlay.sh: line 7: ${$grade_GRADES[@]}: bad substitution

所以基本上我试图首先浏览"${FIRST_GRADE[@]}"然后"${SECOND_GRADE[@]}"

所以行:for name in "${$grade_GRADE[@]}" 将根据我们正在进行的GRADES数组的迭代

进行不同的评估

2 个答案:

答案 0 :(得分:4)

使用临时变量,您可以在bash中使用${!...}

#!/bin/sh -x

GRADES=(FIRST SECOND)
FIRST_GRADE=(JOHN MICHAEL)
SECOND_GRADE=(MARY SUSAN)

for grade in "${GRADES[@]}"
do
   temp=${grade}_GRADE[@]
   for name in ${!temp}
   do
      echo "...$name"
   done
done

答案 1 :(得分:0)

你几乎让你的脚本工作了。这是另一种使用eval的解决方案。

#!/bin/sh -x

GRADES=(FIRST SECOND)
FIRST_GRADE=(JOHN MICHAEL)
SECOND_GRADE=(MARY SUSAN)

for grade in "${GRADES[@]}"
do
   echo $grade
   eval "data=\${${grade}_GRADE[@]}"
   for name in $data
   do
      echo "...$name"
   done
done

更新:正如Glenn Jackman在评论中指出的那样,无法正确处理具有嵌入空格的数组元素,例如

       SECOND_GRADE=("MARY ANN" SUSAN)

要解决此问题,Glenn建议在数组上方data并引用其中的值

       eval "data=(\"\${${grade}_GRADE[@]}\")"
       for name in "${data[@]}";