#!/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
数组的迭代
答案 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[@]}";