我正在尝试使用 shell 脚本实现 anxn 2D 矩阵。我使用两个 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