如何在bash中双重替换数组变量

时间:2018-09-14 14:03:49

标签: arrays bash for-loop substitution

我想使用Shell脚本针对不同体系结构交叉编译一组lib。

一组库:

Intent shareIntent = ShareCompat.IntentBuilder.from(this)
                .setText("your Text")
                .setType("text/plain")
                .getIntent()
                .setPackage("com.google.android.apps.plus");

startActivityForResult(shareIntent, GOOGLE_REQUEST_SHARE);

每个lib专用的内核数组(为此库进行交叉编译。)

LIBS=(FOO ZOO)

基本上,我希望看到这种情况:

FOO_CORES=(ARM_CM3 ARM_CM4 ARM_CR4)

ZOO_CORES=(ARM_CR4)

我可以运行一个for循环,该循环可以遍历库数组。但是,如何引用每个特定于库的内核数组?我可以使用double-substitution来获取每个特定于库的核心名称变量...就是这样!不确定双重替换是否也适用于数组。

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

  make ZOO CORE=ARM_CR4

输出:

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

2 个答案:

答案 0 :(得分:3)

如果您具有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的行为就像是为其分配了名称的参数一样。

答案 1 :(得分:1)

出于间接参数扩展的目的,参数“名称”由数组名称和所需索引组成。

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