Gerando array 2D no Bash com dimensão desconhecida

1

Apenas imaginando se é possível gerar um array 2D se a dimensão não for conhecida antes da entrada do usuário. Por exemplo, se a entrada do usuário 2 2 na linha de comando do shell irá gerar uma base de matriz 2D sobre isso? obrigado

    
por LjinKazama 10.06.2015 / 06:46

2 respostas

2

bash é uma linguagem interpretada e não precisa saber quanta memória deve ser alocada antecipadamente.

Portanto, é possível inicializar dinamicamente uma nova matriz sem declará-la ou expandir uma matriz já declarada para adicionar mais entradas, mas não é possível usar matrizes multidimensionais.

No entanto, isso pode ser falso: como você não forneceu uma tarefa exata para realizar, forneço um exemplo de script bash que mostra como preencher uma tabela m x n definida pelo usuário com números aleatórios (que não são realmente aleatórios, já que cada coluna sempre terá o mesmo número em todas as suas linhas em cada execução, mas isso não é relevante para a pergunta) e é impresso (simplificado de esta resposta de 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
    
por kos 10.06.2015 / 08:15
1

Você pode declarar uma matriz 1D e ler todos os números em uma matriz 1D em tempo de execução. Depois de conhecer a dimensão, você poderia processar a matriz 1D "como uma matriz 2D".

Por exemplo, suponha que a matriz 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)

pseudocó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. Realmente uma matriz 2D é uma espécie de matriz 1D.

    
por nathanesau 10.06.2015 / 07:02