Как смоделировать массив массивов в Bash
Bash действительно является интерпретируемым интерактивным языком, и не обязательно знать, сколько места нужно зарезервировать заранее. Также можно динамически подготовить новый массив, не объявляя его и не расширяя ранее определенный массив для включения дополнительных элементов. Тем не менее многомерные массивы не поддерживаются bash, и мы не можем получить компоненты массива, которые также являются массивами. К счастью, многомерные массивы можно моделировать. В этой статье будут приведены некоторые иллюстрации моделирования массива массивов в скрипте bash.
Пример 01. Использование простых циклов For
У нас есть пример моделирования массива массивов с использованием простого метода. Давайте начнем демонстрировать, как загрузить определяемую пользователем таблицу m x n со случайными числами (которые не являются случайными, потому что каждый столбец всегда будет иметь одинаковое число при каждом запуске в большинстве своих строк, но это не относится к вопросу ), и распечатайте его. Когда мы работаем с любым bash, который у вас есть, bash версии 4, приведенный ниже сценарий, безусловно, будет работать эффективно. Мы не должны в одиночку объявлять 0; это больше похоже на идеальное решение для энергично принимаемых ценностей. Мы объявили массив с ключевым словом «-A». Если мы не определим ассоциативный массив с помощью -A, код может не сработать для нас. Затем ключевое слово read используется для чтения ввода пользователя, то есть строк и столбцов таблицы. Затем мы использовали два цикла for для увеличения строк и столбцов таблицы. В цикле for мы создаем двумерный массив. В следующем цикле for отображаются все значения массива.
Когда вы запускаете файл bash, он попросит пользователя ввести строки и столбцы как «m» и «n». После этого циклы for сгенерируют двумерную таблицу, как показано ниже.
Пример 02. Использование хэшей
Взяв тот же пример, мы можем эмулировать массивы, используя хэши. Однако мы должны быть более осторожны с ведущими нулями и некоторыми другими вещами. Следующее объяснение работает. Однако выход очень далек от идеального. Мы брали строки и столбцы вручную. Цикл for используется для создания матрицы. Затем мы использовали хэши для имитации двумерного массива. Наконец, массив будет распечатан, как показано ниже.
Запустите файл «input.sh» в оболочке bash с помощью команды bash. Вы найдете таблицу с указанным количеством строк и столбцов.
Пример 03. Использование ассоциативных массивов
Давайте рассмотрим пример симуляции с похожим эффектом с использованием ассоциативных массивов, используемых в качестве массива массивов, как показано ниже. После объявления ассоциативного массива мы определили значения для массивов отдельно. После этого мы сделали так, чтобы распечатать значения в двухмерном виде.
Вы можете увидеть результат в виде двумерного массива во время запуска файла. Если мы проигнорируем строку «declare -A arr», оператор echo может отображать (2 3), а не (0 1), поскольку (0,0), (1,0) и другие могли использоваться как математические выражения. выражение и вычисляется как 0 (значение справа от запятой).
Пример 04. Использование ссылок на имена
В bash это частая проблема со ссылками на массивы внутри массивов, когда вам придется создавать ссылки на имена с помощью declare -n. Это имя после -n служит ссылкой на имя для выделенного значения (после =). В настоящее время мы обрабатываем эту переменную только с именем атрибута ref для расширения, как если бы это был массив, и расширяем соответствующим образом цитируемый массив, как и ранее. Давайте рассмотрим пример ссылок на имена. Мы успешно объявили два массива. После этого мы присвоили оба массива другому массиву в качестве члена. Мы использовали цикл for для создания двумерного массива. Мы сделали еще одну переменную, чтобы добавить в нее по одному значения массива «группа» для сравнения. Глубоко внутри он будет обращаться к членам внутренних массивов «bar» и «foo», чтобы принимать значения и сравнивать их при печати сообщения.
Когда мы выполним файл «input.sh», вы увидите следующий вывод. Переменная «lst» имеет значения внутренних массивов внутри массива «groups».
Пример 05. Использование ключевого слова Cut
Только сейчас я наткнулся на это. Был довольно простой подход, который работал для всех. Чтобы показать основную карту для системы, я решил использовать массив, содержащий имя устройства и расположение на экране. Мы должны соединить заголовок модуля и соответствующее расположение дисплея в некоторую единую строку, используя только разделитель, который, как мы предполагали, не будет встречаться ни в одном из наших значений (в моем случае я использовал .). И я использовал ключевое слово «вырезать», чтобы при необходимости разделить конкретные значения на их компоненты. Однако для этого может быть более понятный и простой подход, и это только для иллюстрации того, что в некотором смысле в bash мы можем построить многомерный массив, хотя это и не помогает. После этого вы должны распечатать как имя устройства, так и его местоположение отдельно после создания подстроки.
Давайте запустим файл «input.sh» bash. Вы увидите отделенное устройство и его местоположение в командной строке, как во время выполнения. Решение работает с помощью команды cut.
Пример 06
Давайте возьмем немного более длинный пример для эмуляции многомерного массива. В функции load_alpha() все алфавиты будут загружены в массив. После этого объявляется функция print_Alpha(), которая используется для вывода всех алфавитов в порядке возрастания строк в виде матрицы или двумерного формата. С другой стороны, мы использовали функцию rotate() для поворота массива. Давайте попробуем этот пример в оболочке bash, чтобы увидеть результаты.
Во время выполнения мы обнаружили очень красивую структуру многомерного массива в оболочке bash, как показано ниже.
Заключение
Мы успешно опробовали несколько примеров для имитации массивов массивов в bash. Надеюсь это работает!