Cómo declarar una matriz 2D en bash
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;
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,2
para 3 dimensiones. - la sintaxis es cercana a las matrices tipo "C"
${matrix[2,3]}
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 arr
línea, se echo
imprimirá 2 3
en lugar de 0 1
, porque 0,0
, 1,0
y se tomará como expresión aritmética y se evaluará como 0
(el valor a la derecha del operador de coma).