просто интересно, возможно ли сгенерировать двумерный массив, если размерность неизвестна до ввода данных пользователем. Например, если пользователь введет 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]
Надеюсь, это имеет смысл. На самом деле двумерный массив — это своего рода одномерный массив.