Complete una matriz bash con cadenas que contengan espacios, leyendo entradas de una matriz similar

Complete una matriz bash con cadenas que contengan espacios, leyendo entradas de una matriz similar

He leído varios artículos que hablan sobre cómo llenar una matriz Bash donde cada entrada tiene espacios. Creo que lo he conseguido funcionar.

Lo que tengo que hacer es hacer esto en un bucle, poblando una matriz más grande con el contenido de todas las matrices en cada iteración.

Entonces, tengo un bucle externo que itera a través de las entradas de una matriz que obtuve de otro script. En cada iteración de ese bucle, ejecuto una línea de comando que produce varias líneas de salida y quiero que cada línea sea una entrada de matriz. Tengo que agregar todas esas entradas de la matriz a la matriz de "resumen". Como no conozco una manera de simplemente "agregar el contenido de esta matriz a otra matriz", supongo que tengo que recorrer la matriz más pequeña. Hasta ahora, esto está haciendo lo que necesito. Sin embargo, la adición a la matriz más grande no parece funcionar correctamente. Después de hacer eso, lo agrego a la matriz más grande y verifico la longitud de la matriz más grande, siempre es solo "1".

La parte relevante del guión es aproximadamente esta:

nslist=$(...)
pnarray=()
for ns in $nslist; do
    IFS=$'\n' nspnarray=($(...))
    echo "nspnarray.len[${#nspnarray[@]}]" # This looks fine
    for pn in ${nspnarray[@]}; do
        echo "pn[$pn]" # This looks fine
        IFS=$'\n' pnarray+=$pn # Something wrong with this?
        echo "pnarray.len[${#pnarray[@]}]" # is always 1
    done
done

Este no es un guión completo, así que espero que quede claro. Las líneas con comentarios "Esto se ve bien" imprimen lo que quiero. En mis datos de muestra, la línea de comando que llamo en la asignación "nspnarray" produce cinco líneas de salida, y la declaración impresa "nspnarray.len" muestra "5".

Luego repito cada una de las cinco entradas, imprimiendo cada una. Esto todavía se ve bien. Imprime un valor con espacios, como se esperaba. Luego trato de asignar eso a mi matriz de "resumen" y luego imprimo la longitud de la matriz de resumen, que siempre imprime "1". Supongo que estoy haciendo algo mal en la tarea "¿Algo anda mal con esto?" línea.

Respuesta1

Agregar una matriz a otra matriz es bastante sencillo:

$ a=(1 2 3)
$ b=(4 5 6)
$ a+=("${b[@]}")
$ typeset -p a
declare -a a=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")

Sin embargo, si estás haciendo cosas relativamente complicadas con matrices, deberías usar un lenguaje más adecuado para la tarea. awko perl, por ejemplo. O python. O prácticamente cualquier cosa excepto bash u otros shells.

Un shell es bueno para orquestar la ejecución de otros programas (y canalizaciones de otros programas, y redirección de stdin y stdout, etc.) para hacer cosas o procesar datos. No es bueno para hacer esas otras tareas por sí mismo; de hecho, es terrible en eso.

awktiene matrices multidimensionales (tanto indexadas como asociativas), perltambién las tiene y también tiene estructuras de datos donde las matrices o hashes pueden contener otras matrices y/o hashes, anidados arbitrariamente en profundidad. La mayoría de los demás lenguajes también tienen estructuras de datos complejas.

Y, lo que es igualmente importante, no tienen los problemas de citar o dividir palabras que sí tienen los shells.

información relacionada