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]to store 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

请注意,我已经对您的代码进行了一些额外的清理:

  • 不要将分号放在行尾,它们在 shell 脚本中是多余的。
  • read -p使用而不是打印提示printf
  • 输入循环正在打印 array[i][j](即数组的内容),它应该打印 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

Gordon 的所有评论都是绝对正确的,为了完整起见,我只是补充一点ksh93(我不确定ksh88确实支持多维数组(但它是一个臭名昭著的未(der)记录功能),因此您可以使用本机执行此操作ksh

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 回答