0
#!/bin/bash
declare -a array
printf 'Matrix size:' ;
read n;
printf '\n';
      for ((i=1;i<=n;i++))
        do
      for((j=1;j<=n;j++))
        do
          printf 'x[%d][%d]=' ${array[i][j]};
          read array[i][j];
     done
     done
     echo "Initial matrix:"
        for((i=1;i<=$n;i++))
          do 
        for ((j=1;j<=n;j++))
          do
       printf '%d' ${array[i][j]};
           printf '\n';
        done
        done

Aはbash配列を表示できず、どこが間違っているのかわかりません。たとえば、n=3....配列に数字を入力します (1-9) 表示するとき: 初期行列: 3 3 3 6 6 6 9 9 9 Thx

4

3 に答える 3

5

bash には多次元配列がありません。を参照array[i][j]すると、[j]は無視されます。bash には、浮動小数点演算をサポートしていないなど、この種の処理には適さない傾向がある他の制限もあります (いずれにせよ)。

bash で多次元配列を偽造する必要がある場合は、array[i*n+j]array[i][j] を格納するために使用して偽造できます。

#!/bin/bash
declare -a array
read -p 'Matrix size: ' n
for ((i=1; i<=n; i++)); do
    for ((j=1; j<=n; j++)); do
        read -p "x[$i][$j]=" array[i*n+j]
    done
done

echo "Initial matrix:"
for ((i=1; i<=n; i++)); do 
    for ((j=1; j<=n; j++)); do
        printf '%d ' ${array[i*n+j]}
    done
    printf '\n'
done

コードに追加のクリーンアップを行ったことに注意してください。

  • 行末にセミコロンを置かないでください。シェル スクリプトでは冗長です。
  • read -pの代わりに を使用してプロンプトを出力しprintfます。
  • 入力ループは、i と j を出力すべき場所に array[i][j] (つまり、配列の内容) を出力していました。
  • 文字列内の変数を補間するために を使用する必要はありません。二重引用符で囲まれprintfた文字列に埋め込むだけです(または、変数名の末尾がどこにあるかというあいまいさを避けるために を使用します)。$i${i}
  • 最後に、配列を印刷するときに、各要素の後ではなく、各行の後に改行を配置しました。
于 2013-04-28T16:13:55.663 に答える
1

bash 4 の連想配列を使用して多次元配列を取得することは可能です...ちょっと:

#!/bin/bash

declare -A array

printf "Matrix size: "
read -r n
for ((i = 0; i < n; i++)); do
    for ((j = 0; j < n; j++)); do
        printf "array[$i][$j] = "
        read -r val
        array["${i}_${j}"]=$val
    done
done

echo "Initial matrix:"
for key in "${!array[@]}"; do
    val=${array[$key]}
    echo "$key $val"
done

ただし、bash で利用できる真の多次元配列サポートはありません。

標準の数値インデックス配列を使用した回答とは異なり、このアプローチでは、配列を読み取る前に配列の次元を知る必要はありません。

于 2013-04-28T16:57:12.117 に答える
0

ゴードンの発言はすべて完全に正しいです。完全を期すために、多次元配列をサポートしていることを追加します(しかし、それは悪名高い(der)documented機能ですksh93。:ksh88ksh

matrix.sh:

#!/bin/ksh

printf "Matrix size: "
read n
for ((i = 0; i < n; i++)); do
        for ((j = 0; j < n; j++)); do
                printf "array[$i][$j] = "
                read array[i][j]
        done
done

echo "Initial matrix:"
for ((i = 0; i < ${#array[@]}; i++)); do
        for k in "${array[i][@]}"; do
                printf "${k} "
        done
        echo
done

例:

$ ./matrix.sh
Matrix size: 2
array[0][0] = 3
array[0][1] = 4
array[1][0] = 5
array[1][1] = 6
Initial matrix:
3 4
5 6
于 2013-04-28T16:48:17.520 に答える