Intento escribir un bucle anidado y no sé cómo escribirlo. Tal vez estoy mirando en la dirección equivocada, pero lo que intento escribir es:
declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")
declare -a subgroups=("bar" "foo")
Entonces me gustaría iterar los subgrupos (en el futuro más bar s y foo s vendrán), y dentro de ellos itérelos ya que pueden tener una cantidad diferente de elementos.
La salida deseada sería algo como:
group name: bar with group members: alpha bravo charlie
working on alpha of the bar group
working on bravo of the bar group
working on charlie of the bar group
group name: foo with group members: delta echo foxtrot golf
working on delta of the foo group
working on echo of the foo group
working on foxtrot of the foo group
working on golf of the foo group
El código de cierre que he escrito parece fallar en la barra y fu matrices y su expansión con los elementos de cada conjunto.
for group in "${subgroups[@]}"; do
lst=${!group}
echo "group name: ${group} with group members: ${!lst[@]}"
for element in "${!lst[@]}"; do
echo -en "\tworking on $element of the $group group\n"
done
done
Y la salida es:
group name: bar with group members: 0
working on 0 of the bar group
group name: foo with group members: 0
working on 0 of the foo group
Respuesta aceptada:
Este es un problema bastante común en bash
, para hacer referencia a una matriz dentro de matrices para las que necesita crear referencias de nombre con declare -n
. El nombre que sigue a -n
actuará como una referencia de nombre para el valor asignado (después de =
). Ahora tratamos esta variable con el atributo nameref para expandirla como si fuera una matriz y hacer una expansión de matriz entrecomillada adecuada como antes.
for group in "${subgroups[@]}"; do
declare -n lst="$group"
echo "group name: ${group} with group members: ${lst[@]}"
for element in "${lst[@]}"; do
echo -en "\tworking on $element of the $group group\n"
done
done
Tenga en cuenta que bash
solo admite referencias de nombre de v4.3 en adelante. Para versiones anteriores y otras soluciones, consulte Asignación de variables indirectas/de referencia