2013-12-13 5 views
3
#!/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 мы проходим через

+1

использование '#!/bin/bash' для Баш сценариев –

ответ

4

С временной переменной вы можете использовать ${!...} в b зола:

#!/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 
+0

Прекрасный ... спасибо Бени. Есть ли где-нибудь, что вы знаете об этом, объясняет использование различного синтаксиса (т.е. (, $, ", {, [@] и т. Д.), Было бы хорошо, если бы я точно знал, что происходит – mbbxedh2

+0

Все это упоминается в' man bash '.. И тогда googling вокруг, чтобы увидеть, есть ли лучший способ – BeniBela

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 

Update:, как Гленн Джекман точек в комментариях это не обрабатывает правильно элементы массива со встроенными пробелами, как

 SECOND_GRADE=("MARY ANN" SUSAN) 

Чтобы исправить это Гленн предлагает сделать data над массивом и со ссылкой на значения в нем

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

Чтобы правильно обрабатывать имена с пробелами, сделайте« данные »массивом:' eval '$ (printf' data = ("$ {% s_GRADE [@]}") '$ grade) ", для имени в" $ {data [@]} "; ...' –

+0

@glennjackman благодарит вас за комментарий. Также вам не нужна дополнительная 'printf', поскольку вы можете избежать кавычек в строке, представленной 'eval'. –

Смежные вопросы