Můžete je simulovat například pomocí hashe, ale je třeba si dát pozor na úvodní nuly a mnoho dalších věcí. Další ukázka funguje, ale má k optimálnímu řešení daleko.
#!/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
výše uvedený příklad vytvoří matici 4x5 s náhodnými čísly a vytiskne ji transponovanou s výsledkem příkladu
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
Princip je následující:Vytvoření jednoho asociativního pole, kde index je řetězec jako 3,4
. Výhody:
- je možné použít pro pole libovolné dimenze;) jako:
30,40,2
pro 3 rozměr. - syntaxe je blízká "C" jako pole
${matrix[2,3]}
Bash nemá vícerozměrné pole. Poněkud podobný efekt ale můžete simulovat pomocí asociativních polí. Následuje příklad asociativního pole, které předstírá, že se používá jako vícerozměrné pole:
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
Pokud nedeklarujete pole jako asociativní (s -A
), výše uvedené nebude fungovat. Pokud například vynecháte declare -A arr
řádek echo
vytiskne 2 3
místo 0 1
, protože 0,0
, 1,0
a takový bude brán jako aritmetický výraz a vyhodnocen na 0
(hodnota napravo od operátoru čárka).