シェルスクリプトを使用してanxn 2D行列を実装しようとしています。行列要素の入力を取得するには、2つのforループを使用します。しかし、別のループを使用して要素を取得した後に値を印刷すると、最後の行だけがn回印刷されます。以下のコードと出力を見つけてください。
#!/bin/bash
read -p "Enter the size of matrix: " n
c=`expr $n - 1`
# Get the matrix elements
for i in $(seq 0 1 $c)
do
for j in $(seq 0 1 $c)
do
read -p "enter the value of $i, $j element " arr[$i,$j]
done
done
# Print the matrix
for i in $(seq 0 1 $c)
do
for j in $(seq 0 1 $c)
do
echo -n "${arr[$i,$j]} "
done
echo
done
出力:
ubuntu@ip-172-31-6-229:~/shellscript$ ./matrix.sh
Enter the size of matrix: 3
enter the value of 0, 0 element 1
enter the value of 0, 1 element 2
enter the value of 0, 2 element 3
enter the value of 1, 0 element 4
enter the value of 1, 1 element 5
enter the value of 1, 2 element 6
enter the value of 2, 0 element 7
enter the value of 2, 1 element 8
enter the value of 2, 2 element 9
7 8 9
7 8 9
7 8 9
ご覧のとおり、出力を印刷するときは、すべての行の最後の行を印刷します。誰でもこの問題を解決するのに役立ちますか?
シェル:BASH
ありがとう
答え1
長い話を短く
declare -A arr
ループから値を読み取る前に追加すると、コードは目的の方法で機能します。しかし、自分が何をしているのかわからないので、より長いバージョンを必ず読んでください。
拡張バージョン
Bashは多次元配列をサポートしません。ここで本質的に生成することは次のとおりです。連想配列そしてこれが機能するためには、変数が連想配列であることを明示的に宣言する必要があります。したがってdeclare -A arr
、。詳細については、次を参照してください。ここ。
各入力の後に配列を印刷して、実際に配列がどのように変更されたかを確認できるので、内部ループは次のようになります。
for j in $(seq 0 1 $c)
do
read -p "enter the value of $i, $j element " arr[$i,$j]
echo ${arr[*]}
done
3つのインデックス(n=3
0、1、2)のみが作成され、後者のインデックスがj
変更されると、そのインデックスの値が置き換えられます。
そうでない場合は、declare -A
連想配列を作成せずに整数でインデックス付きの正規配列を作成します。ここに問題があります。インデックスは、コンマ演算子が両方を評価し、右側の値のみを返す算術式として扱われます。
答え2
以下を試してください。
#!/bin/bash
read -p "Enter the size of matrix: " n
c=`expr $n - 1`
declare -A arr
# Get the matrix elements
for ((i=0;i<=c;i++))
do
for ((j=0;j<=c;j++))
do
read -p "enter the value of $i, $j element " arr[$i,$j]
done
done
# Print the matrix
for ((i=0;i<=c;i++))
do
for ((j=0;j<=c;j++))
do
echo -n "${arr[$i,$j]} "
done
echo
done
結果:
$ ./matrix.sh
Enter the size of matrix: 3
enter the value of 0, 0 element 1
enter the value of 0, 1 element 2
enter the value of 0, 2 element 3
enter the value of 1, 0 element 4
enter the value of 1, 1 element 5
enter the value of 1, 2 element 6
enter the value of 2, 0 element 7
enter the value of 2, 1 element 8
enter the value of 2, 2 element 9
1 2 3
4 5 6
7 8 9