Как дважды подставить переменную массива в bash - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу кросс-компилировать массив libs для разных архитектур, используя скрипт оболочки.

Массив библиотек:

LIBS=(FOO ZOO)

Массив ядер, специфичных для каждой библиотеки (для которых эта библиотека должна быть скомпилирована.)

FOO_CORES=(ARM_CM3 ARM_CM4 ARM_CR4)

ZOO_CORES=(ARM_CR4)

В принципе, я бы хотел, чтобы это произошло:

  make FOO CORE=ARM_CM3
  make FOO CORE=ARM_CM4
  make FOO CORE=ARM_CR4

  make ZOO CORE=ARM_CR4

Я могу запустить цикл for, который может перебирать массив библиотек. Но как мне обратиться к каждому библиотечному массиву ядер? Я могу получить каждую переменную имени ядра для конкретной библиотеки, используя двойную подстановку ... но это все! Не уверен, работает ли двойная замена с массивами.

for lib in ${LIBS[@]};do
  eval "lib_name=${lib}_CORES"
  cores_list=${!lib_name}
  echo $lib_name $cores_list
done

Выход:

FOO_CORES ARM_CM3
ZOO_CORES ARM_CR4

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Если у вас Bash 4.3 или новее, вы можете использовать namerefs :

for lib in "${LIBS[@]}"; do
    declare -n list=${lib}_CORES
    for core in "${list[@]}"; do
        make "$lib" "$core"
    done
done

Ключом является строка declare -n: list будет вести себя так, как если бы это был параметр, имя которого было ему присвоено.

0 голосов
/ 14 сентября 2018

В целях косвенного расширения параметра параметр «имя» состоит из имени массива и требуемого индекса.

for lib in "${LIBS[@]}"; do
  a=${lib}_CORES
  t="$a[@]"
  printf '%s\n' "$a"
  printf ' %s\n' "${!t}"
done

создает

FOO_CORES
 ARM_CM3
 ARM_CM4
 ARM_CR4
ZOO_CORES
 ARM_CR4
...