90

bashで2D配列を宣言してから0に初期化する方法を知りたいです。

C では次のようになります。

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

また、要素に値を割り当てるにはどうすればよいですか? Cのように:

a[2][3] = 3;
4

12 に答える 12

83

たとえば、ハッシュを使用してそれらをシミュレートできますが、先頭のゼロや他の多くのことに注意する必要があります。次のデモは機能しますが、最適なソリューションにはほど遠いものです。

#!/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,23 次元の場合。
  • 構文は配列のように「C」に近い ${matrix[2,3]}
于 2013-05-10T17:26:34.413 に答える
24

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
于 2013-05-10T17:04:45.863 に答える
1

単純に 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
于 2016-09-10T18:12:22.217 に答える