apenas me perguntando se é possível gerar uma matriz 2D se a dimensão não for conhecida antes da entrada do usuário. Por exemplo, se o usuário inserir 2 2 na linha de comando, o shell irá gerar um array 2D com base nisso? obrigado
Responder1
bash
é uma linguagem interpretada e não precisa saber antecipadamente quanta memória deve ser alocada.
Portanto é possível inicializar dinamicamente um novo array sem tê-lo declarado ou expandir um array já declarado para adicionar mais entradas, porém não é possível usar arrays multidimensionais.
No entanto, isso pode ser falsificado: como você não forneceu uma tarefa exata para realizar, fornecerei um bash
exemplo de script que mostra como preencher uma m x n
tabela definida pelo usuário com números aleatórios (que não são realmente aleatórios, pois cada coluna será sempre terá o mesmo número em todas as suas linhas em cada execução, mas isso não é relevante para a questão) e imprima-o (simplificado deesseResposta do estouro de pilha):
#!/bin/bash
declare -a array
read -p 'm: ' m
read -p 'n: ' n
for ((i=0; i<m; i++))
do
for ((j=0; j<n; j++))
do
a[${i},${j}]=$RANDOM
done
done
for ((i=0; i<m; i++))
do
for ((j=0; j<n; j++))
do
echo -ne "${a[${i},${j}]}\t"
done
echo
done
Responder2
Você poderia declarar um array 1D e ler todos os números em um array 1D em tempo de execução. Depois de conhecer a dimensão, você poderá processar o array 1D "como um array 2D".
Por exemplo, suponha que o array 1D contenha
[1, 5, 9, 11]
Se realmente quisermos
[[1,5], [9,11]]
como nosso array é tal que o índice 0 é [1,5], então você poderia fazer algo assim para acessar [1,5] (pos = 0)
pseudo-código
for i in 0:(pos*dim + dim-1)
echo arr[i]
para acessar [9,11] (pos = 1)
for i in pos*dim:(pos*dim + dim - 1)
echo arr[i]
Espero que isso faça algum sentido. Na verdade, um array 2D é uma espécie de array 1D.