bashで2D配列を宣言してから0に初期化する方法を知りたいです。
C では次のようになります。
int a[4][5] = {0};
また、要素に値を割り当てるにはどうすればよいですか? Cのように:
a[2][3] = 3;
たとえば、ハッシュを使用してそれらをシミュレートできますが、先頭のゼロや他の多くのことに注意する必要があります。次のデモは機能しますが、最適なソリューションにはほど遠いものです。
#!/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
上記の例では、乱数を使用して 4x5 行列を作成し、それを転置して出力し、結果の例を示します。
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
原則は次のとおりです。インデックスが のような文字列である 1 つの連想配列を作成します3,4
。メリット:
30,40,2
3 次元の場合。${matrix[2,3]}
Bash は多次元配列をサポートしていません。
ただし、間接展開を使用してシミュレートできます。
#!/bin/bash
declare -a a0=(1 2 3 4)
declare -a a1=(5 6 7 8)
var="a1[1]"
echo ${!var} # outputs 6
この方法でも割り当てが可能です。
let $var=55
echo ${a1[1]} # outputs 55
編集 1 : ファイルからそのような配列を読み取り、各行を 1 行に、値をスペースで区切って読み取るには、次のようにします。
idx=0
while read -a a$idx; do
let idx++;
done </tmp/some_file
編集 2 : を宣言して初期化a0..a3[0..4]
するに0
は、次を実行できます。
for i in {0..3}; do
eval "declare -a a$i=( $(for j in {0..4}; do echo 0; done) )"
done
単純に 2 つの関数を定義して ($4 は割り当てられた値)、任意の名前 ($1) とインデックス ($2 および $3) を使用して行列を読み取り、eval と間接参照を利用することができます。
#!/bin/bash
matrix_write () {
eval $1"_"$2"_"$3=$4
# aux=$1"_"$2"_"$3 # Alternative way
# let $aux=$4 # ---
}
matrix_read () {
aux=$1"_"$2"_"$3
echo ${!aux}
}
for ((i=1;i<10;i=i+1)); do
for ((j=1;j<10;j=j+1)); do
matrix_write a $i $j $[$i*10+$j]
done
done
for ((i=1;i<10;i=i+1)); do
for ((j=1;j<10;j=j+1)); do
echo "a_"$i"_"$j"="$(matrix_read a $i $j)
done
done