Cómo declarar una matriz 2D en bash

Resuelto Anis_Stack asked hace 11 años • 12 respuestas

Me pregunto cómo declarar una matriz 2D en bash y luego inicializarla a 0.

En C se ve así:

int a[4][5] = {0};

¿Y cómo le asigno un valor a un elemento? Como en C:

a[2][3] = 3;
Anis_Stack avatar May 10 '13 23:05 Anis_Stack
Aceptado

Puedes simularlos, por ejemplo, con hashes, pero debes preocuparte por los ceros iniciales y muchas otras cosas. La siguiente demostración funciona, pero está lejos de ser una solución óptima.

#!/bin/bash
declare -A matrix
num_rows=4
num_columns=5

for ((i=1;i<=num_rows;i++)) do
    for ((j=1;j<=num_columns;j++)) do
        matrix[$i,$j]=$RANDOM
    done
done

f1="%$((${#num_rows}+1))s"
f2=" %9s"

printf "$f1" ''
for ((i=1;i<=num_rows;i++)) do
    printf "$f2" $i
done
echo

for ((j=1;j<=num_columns;j++)) do
    printf "$f1" $j
    for ((i=1;i<=num_rows;i++)) do
        printf "$f2" ${matrix[$i,$j]}
    done
    echo
done

el ejemplo anterior crea una matriz de 4x5 con números aleatorios y la imprime transpuesta, con el resultado del ejemplo

           1         2         3         4
 1     18006     31193     16110     23297
 2     26229     19869      1140     19837
 3      8192      2181     25512      2318
 4      3269     25516     18701      7977
 5     31775     17358      4468     30345

El principio es: crear una matriz asociativa donde el índice sea una cadena como 3,4. Los beneficios:

  • es posible usarlo para matrices de cualquier dimensión;) como: 30,40,2para 3 dimensiones.
  • la sintaxis es cercana a las matrices tipo "C" ${matrix[2,3]}
clt60 avatar May 10 '2013 17:05 clt60

Bash no tiene una matriz multidimensional. Pero puedes simular un efecto algo similar con matrices asociativas. El siguiente es un ejemplo de matriz asociativa que pretende ser utilizada como matriz multidimensional:

declare -A arr
arr[0,0]=0
arr[0,1]=1
arr[1,0]=2
arr[1,1]=3
echo "${arr[0,0]} ${arr[0,1]}" # will print 0 1

Si no declara la matriz como asociativa (con -A), lo anterior no funcionará. Por ejemplo, si omite la declare -A arrlínea, se echoimprimirá 2 3en lugar de 0 1, porque 0,0, 1,0y se tomará como expresión aritmética y se evaluará como 0(el valor a la derecha del operador de coma).

Jahid avatar Jul 07 '2015 18:07 Jahid