
Eu li vários artigos que falam sobre como preencher um array Bash onde cada entrada contém espaços. Acredito que consegui fazer isso funcionar.
O que preciso fazer é fazer isso em um loop, preenchendo um array maior com o conteúdo de todos os arrays em cada iteração.
Então, eu tenho um loop externo iterando pelas entradas de um array que obtive de outro script. Em cada iteração desse loop, executo uma linha de comando que produz várias linhas de saída e quero que cada linha seja uma entrada de array. Eu tenho que adicionar todas essas entradas da matriz à matriz "resumo". Como não conheço uma maneira de apenas "acrescentar o conteúdo deste array a outro array", presumo que preciso iterar pelo array menor. Até agora, isso está fazendo o que eu preciso. No entanto, o acréscimo à matriz maior não parece estar funcionando corretamente. Depois de anexar ao array maior e verificar o comprimento do array maior, é sempre apenas "1".
A parte relevante do script é 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 não é um script completo, então espero que esteja claro. As linhas com comentários "Parece bom" imprimem o que eu quero. Nos meus dados de amostra, a linha de comando que chamo na atribuição "nspnarray" produz cinco linhas de saída, e a instrução de impressão "nspnarray.len" mostra "5".
Em seguida, itero cada uma das cinco entradas, imprimindo cada uma delas. Isso ainda parece bom. Ele imprime um valor com espaços, conforme esperado. Em seguida, tento atribuir isso ao meu array de "resumo" e imprimo o comprimento do array de resumo, que sempre imprime "1". Presumo que estou fazendo algo errado na tarefa "Algo errado com isso?" linha.
Responder1
Adicionar um array a outro array é bastante simples:
$ 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")
Porém, se você estiver fazendo coisas relativamente complicadas com arrays, você realmente deveria usar uma linguagem mais adequada para a tarefa. awk
ou perl
, por exemplo. Ou python
. Ou praticamente qualquer coisa, exceto bash ou outros shells.
Um shell é bom para orquestrar a execução de outros programas (e pipelines de outros programas, e redirecionamento de stdin e stdout, etc.) para fazer coisas ou processar dados. Ele não é bom em realizar essas outras tarefas sozinho - na verdade, é péssimo nisso.
awk
possui matrizes multidimensionais (indexadas e associativas), perl
também possui e também possui estruturas de dados onde matrizes ou hashes podem conter outras matrizes e/ou hashes, aninhados arbitrariamente em profundidade. A maioria das outras linguagens também possui estruturas de dados complexas.
E, igualmente importante, eles não têm os problemas de citação ou divisão de palavras que os shells têm.