How to declare 2D array in bash

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

I'm wondering how to declare a 2D array in bash and then initialize to 0.

In C it looks like this:

int a[4][5] = {0};

And how do I assign a value to an element? As in C:

a[2][3] = 3;

回答1:

You can simulate them for example with hashes, but need care about the leading zeroes and many other things. The next demonstration works, but it is far from optimal solution.

#!/bin/bash declare -A matrix num_rows=4 num_columns=5  for ((i=1;i<=num_rows;i++)) do     for ((j=1;j<=num_columns;j++)) do         matrix[$i,$j]=$RANDOM     done done  f1="%$((${#num_rows}+1))s" f2=" %9s"  printf "$f1" '' for ((i=1;i<=num_rows;i++)) do     printf "$f2" $i done echo  for ((j=1;j<=num_columns;j++)) do     printf "$f1" $j     for ((i=1;i<=num_rows;i++)) do         printf "$f2" ${matrix[$i,$j]}     done     echo done

the above example creates a 4x5 matrix with random numbers and print it transposed, with the example result

           1         2         3         4  1     18006     31193     16110     23297  2     26229     19869      1140     19837  3      8192      2181     25512      2318  4      3269     25516     18701      7977  5     31775     17358      4468     30345

The principle is: Creating one associative array where the index is an string like 3,4. The benefits:

  • it's possible to use for any-dimension arrays ;) like: 30,40,2 for 3 dimensional.
  • the syntax is close to "C" like arrays ${matrix[2,3]}


回答2:

Bash does not support multidimensional arrays.

You can simulate it though by using indirect expansion:

#!/bin/bash declare -a a0=(1 2 3 4) declare -a a1=(5 6 7 8) var="a1[1]" echo ${!var}  # outputs 6

Assignments are also possible with this method:

let $var=55 echo ${a1[1]}  # outputs 55

Edit 1: To read such an array from a file, with each row on a line, and values delimited by space, use this:

idx=0 while read -a a$idx; do     let idx++; done </tmp/some_file

Edit 2: To declare and initialize a0..a3[0..4] to 0, you could run:

for i in {0..3}; do     eval "declare -a a$i=( $(for j in {0..4}; do echo 0; done) )" done


回答3:

Bash doesn't have multi-dimensional array. But you can simulate a somewhat similar effect with associative arrays. The following is an example of associative array pretending to be used as multi-dimensional array:

declare -A arr arr[0,0]=0 arr[0,1]=1 arr[1,0]=2 arr[1,1]=3 echo "${arr[0,0]} ${arr[0,1]}" # will print 0 1

If you don't declare the array as associative (with -A), the above won't work. For example, if you omit the declare -A arr line, the echo will print 2 3 instead of 0 1, because 0,0, 1,0 and such will be taken as arithmetic expression and evaluated to 0 (the value to the right of the comma operator).



回答4:

Another approach is you can represent each row as a string, i.e. mapping the 2D array into an 1D array. Then, all you need to do is unpack and repack the row's string whenever you make an edit:

# Init a 4x5 matrix a=("0 0 0 0 0" "0 0 0 0 0" "0 0 0 0 0" "0 0 0 0 0")  function aset {     IFS=' ' read -        
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!