${!ARRAYNAME[@]}
significa "los índices de ARRAYNAME
". Como se indica en el bash man page ya que ARRAYNAME
está establecido, pero como una cadena, no como una matriz, devuelve 0
.
Aquí hay una solución usando eval
.
#!/usr/bin/env bash
ARRAYNAME='FRUITS'
FRUITS=(APPLE BANANA ORANGE)
eval array=\(\${${ARRAYNAME}[@]} \)
for fruit in "${array[@]}"; do
echo ${fruit}
done
Lo que estaba originalmente tratando de hacer era crear un Indirect Reference. Estos se introdujeron en la versión 2 de bash y se suponía que reemplazaban en gran medida la necesidad de eval
cuando se intentaba lograr un comportamiento de reflexión en el shell.
Lo que tiene que hacer al utilizar referencias indirectas con matrices es incluir el [@]
en su conjetura en el nombre de la variable:
#!/usr/bin/env bash
ARRAYNAME='FRUITS'
FRUITS=(APPLE BANANA ORANGE)
array="${ARRAYNAME}[@]"
for fruit in "${!array}"; do
echo $fruit
done
Dicho todo esto, una cosa es utilizar referencias indirectas en este ejemplo trivial, pero, como se indica en el enlace proporcionado por Dennis Williamson, debe vacilar en utilizarlos en scripts del mundo real. Están todos garantizados para hacer que su código sea más confuso de lo necesario. Por lo general, puede obtener la funcionalidad que necesita con una matriz asociativa.
favor ver [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). –