在bash上声明和使用矩阵

时间:2015-07-28 20:52:46

标签: arrays bash matrix

我正在尝试使用矩阵打印一些在 Slackware 中生成矩阵的元素。首先,我在生成矩阵时打印矩阵。然后我打印,然后我更改[5,5] 上的元素,然后再次打印

#!/bin/bash
MW=10
MH=10

function Inic {
   for (( i=0 ; i<$MH ; i++ )) do
      for (( j=0 ; j<$MW ; j++ )) do
         MATRIX[${i},${j}]="$i$j" ;
         printf "${MATRIX[$i,$j]} " ;
      done
      printf "\n" ;
   done
   printf "\n" ;
}

function Print {
   for (( Imp=0 ; Imp<$MH ; Imp++ )) do
      for (( Jmp=0 ; Jmp<$MW ; Jmp++ )) do
         printf "${MATRIX[$Imp,$Jmp]} " ;
      done
      echo
   done
   printf "\n"
}

Inic;

Print;

MATRIX[5,5]='**'

Print;

问题是,当我运行脚本时,它会向我显示:

00 01 02 03 04 05 06 07 08 09 
10 11 12 13 14 15 16 17 18 19 
20 21 22 23 24 25 26 27 28 29 
30 31 32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 48 49 
50 51 52 53 54 55 56 57 58 59 
60 61 62 63 64 65 66 67 68 69 
70 71 72 73 74 75 76 77 78 79 
80 81 82 83 84 85 86 87 88 89 
90 91 92 93 94 95 96 97 98 99 

90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 
90 91 92 93 94 95 96 97 98 99 

90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99 
90 91 92 93 94 ** 96 97 98 99

为什么它只保留最后一行?

2 个答案:

答案 0 :(得分:2)

MATRIX是一个普通的索引数组。这意味着

中的索引
MATRIX[$i,$j]

在aritmetic上下文中进行计算,其中$i, $j使用对其右侧操作数求值的逗号运算符。你想要使用的是一个关联数组,它将其索引视为任意字符串,

declare -A MATRIX

Inic似乎有效,因为您打印每个矩阵单元格,然后才能被另一个条目覆盖。

答案 1 :(得分:1)

因为(1)virtual只有1维数组,(2)bash索引被评估为算术表达式,(3)逗号分隔的算术表达式列表评估到最后一个表达式。因此[...]MATRIX[5,5]相同,与MATRIX[71,22,33,94,5]相同。

可以使用MATRIX[5]代替MATRIX[$i * $MW + $j]