Генерация двумерного массива в Bash с неизвестной размерностью

Генерация двумерного массива в Bash с неизвестной размерностью

просто интересно, возможно ли сгенерировать двумерный массив, если размерность неизвестна до ввода данных пользователем. Например, если пользователь введет 2 2 в командной строке, оболочка сгенерирует двумерный массив на основе этого? спасибо

решение1

bashявляется интерпретируемым языком, и ему не нужно заранее знать, сколько памяти выделить.

Таким образом, можно динамически инициализировать новый массив, не объявляя его, или расширить уже объявленный массив, добавив в него больше записей, однако использовать многомерные массивы невозможно.

Однако это можно подделать: поскольку вы не указали точную задачу для выполнения, я приведу bashпример скрипта, который показывает, как заполнить пользовательскую m x nтаблицу случайными числами (которые на самом деле не случайны, поскольку каждый столбец всегда будет иметь одно и то же число во всех своих строках при каждом запуске, но это не имеет отношения к вопросу) и распечатать ее (упрощенно изэтотОтвет Stack Overflow):

#!/bin/bash

declare -a array
read -p 'm: ' m
read -p 'n: ' n
for ((i=0; i<m; i++))
do
    for ((j=0; j<n; j++))
    do
        a[${i},${j}]=$RANDOM
    done
done
for ((i=0; i<m; i++))
do
    for ((j=0; j<n; j++))
    do
        echo -ne "${a[${i},${j}]}\t"
    done
    echo
done

решение2

Вы можете объявить одномерный массив и считать все числа в одномерный массив во время выполнения. Узнав размерность, вы можете обрабатывать одномерный массив "как двумерный массив".

Например, предположим, что одномерный массив содержит

[1, 5, 9, 11]

Если мы действительно хотим

[[1,5], [9,11]]

так как наш массив такой, что индекс 0 равен [1,5], то вы можете сделать что-то вроде этого, чтобы получить доступ к [1,5] (pos = 0)

псевдокод

for i in 0:(pos*dim + dim-1)  
    echo arr[i]

для доступа [9,11] (поз = 1)

for i in pos*dim:(pos*dim + dim - 1)
    echo arr[i]

Надеюсь, это имеет смысл. На самом деле двумерный массив — это своего рода одномерный массив.

Связанный контент