Puoi simularli ad esempio con gli hash, ma devi fare attenzione agli zeri iniziali e molte altre cose. La prossima dimostrazione funziona, ma è tutt'altro che una soluzione ottimale.
#!/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
l'esempio precedente crea una matrice 4x5 con numeri casuali e la stampa trasposta, con il risultato dell'esempio
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
Il principio è:creare un array associativo in cui l'indice è una stringa come 3,4
. I vantaggi:
- è possibile utilizzare per array di qualsiasi dimensione;) come:
30,40,2
per 3 dimensionale. - la sintassi è vicina alla "C" come gli array
${matrix[2,3]}
Bash non ha un array multidimensionale. Ma puoi simulare un effetto in qualche modo simile con gli array associativi. Quello che segue è un esempio di array associativo che finge di essere usato come array multidimensionale:
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
Se non dichiari l'array come associativo (con -A
), quanto sopra non funzionerà. Ad esempio, se ometti declare -A arr
riga, il echo
stamperà 2 3
invece di 0 1
, perché 0,0
, 1,0
e tale sarà presa come espressione aritmetica e valutata a 0
(il valore a destra dell'operatore virgola).