Bash вывести содержимое массива

Глава 25. Массивы

Новейшие версии Bash поддерживают одномерные массивы. Инициализация элементов массива может быть произведена в виде: variable[xx]. Можно явно объявить массив в сценарии, с помощью директивы declare: declare -a variable. Обращаться к отдельным элементам массива можно с помощью фигурных скобок, т.е.: $ .

Пример 25-1. Простой массив

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

Эти примеры еще раз подтверждают отсутствие контроля типов в Bash.

Пример 25-2. Форматирование стихотворения

При работе с отдельными элементами массива можно использовать специфический синтаксис, даже стандартные команды и операторы Bash адаптированы для работы с массивами.

При работе с массивами, некоторые встроенные команды Bash имеют несколько иной смысл. Например, unset — удаляет отдельные элементы массива, или даже массив целиком.

Пример 25-3. Некоторые специфичные особенности массивов

Как видно из предыдущего примера, обращение к $ или $ относится ко всем элементам массива. Чтобы получить количество элементов массива, можно обратиться к $ или к $ . $ — это длина (количество символов) первого элемента массива, т.е. $ .

Пример 25-4. Пустые массивы и пустые элементы

Разница между $ и $ такая же, как между $@ и $*. Эти свойства массивов широко применяются на практике.

Операция подстановки команд — array=( element1 element2 . elementN ), позволяет загружать содержимое текстовых файлов в массивы.

Пример 25-5. Копирование и конкатенация массивов

Массивы допускают перенос хорошо известных алгоритмов в сценарии на языке командной оболочки. Хорошо ли это — решать вам.

Пример 25-6. Старая, добрая: «Пузырьковая» сортировка

Можно ли вложить один массив в другой?

Вложенные массивы, в комбинации с косвенными ссылками, предоставляют в распоряжение программиста ряд замечательных возможностей

Пример 25-7. Вложенные массивы и косвенные ссылки

С помощью массивов, на языке командной оболочки, вполне возможно реализовать алгоритм Решета Эратосфена . Конечно же — это очень ресурсоемкая задача. В виде сценария она будет работать мучительно долго, так что лучше всего реализовать ее на каком либо другом, компилирующем, языке программирования, таком как C.

Пример 25-8. Пример реализации алгоритма Решето Эратосфена

Сравните этот сценарий с генератором простых чисел, не использующим массивов, Пример A-18.

Массивы позволяют эмулировать некоторые структуры данных, поддержка которых в Bash не предусмотрена.

Пример 25-9. Эмуляция структуры «СТЕК» («первый вошел — последний вышел»)

Иногда, манипуляции с «индексами» массивов могут потребовать введения переменных для хранения промежуточных результатов. В таких случаях вам предоставляется лишний повод подумать о реализации проекта на более мощном языке программирования, например Perl или C.

Пример 25-10. Исследование математических последовательностей

Bash поддерживает только одномерные массивы, но, путем небольших ухищрений, можно эмулировать многомерные массивы.

Пример 25-11. Эмуляция массива с двумя измерениями

По существу, двумерный массив эквивалентен одномерному, с тем лишь различием, что для индексации отдельных элементов используются два индекса — «строка» и «столбец» .

Более сложный пример эмуляции двумерного массива вы найдете в Пример A-11.

Источник

Массивы Bash Arrays

Bash Arrays

В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в ваших скриптах Bash.

Массивы являются одной из наиболее используемых и фундаментальных структур данных. Вы можете думать, что массив — это переменная, которая может хранить несколько переменных внутри него.

Bash Arrays

Bash поддерживает одномерные числовые и ассоциативные типы массивов. Числовые массивы ссылаются с помощью целых чисел, а ассоциативные — с использованием строк.

Численно индексированные массивы могут быть доступны с конца, используя отрицательные индексы, индекс -1 ссылок на последний элемент. Индексы не должны быть смежными.

В отличие от большинства языков программирования, элементы массива Bash не обязательно должны быть одного типа данных. Вы можете создать массив, который содержит как строки, так и числа.

Bash не поддерживает многомерные массивы, и вы не можете иметь элементы массива, которые также являются массивами.

Не существует ограничения на максимальное количество элементов, которые могут быть сохранены в массиве.

Создание массивов Bash

Массивы в Bash могут быть инициализированы разными способами.

Создание численно проиндексированных массивов

Переменные Bash являются нетипизированными, любая переменная может быть использована в качестве индексированного массива без его объявления.

Чтобы явным образом объявить массив, используйте встроенное объявление:

Где index_* положительное целое число.

Другой способ создания числового массива — указать список элементов в скобках, разделенных пробелом:

Когда массив создается с использованием приведенной выше формы, индексация начинается с нуля, т.е. первый элемент имеет индекс 0 .

Создание ассоциативных массивов

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

Чтобы объявить ассоциативный массив, используйте declare встроенную -A опцию (в верхнем регистре):

Ассоциативные массивы могут быть созданы с использованием следующей формы:

Вы также можете создать ассоциативный массив, используя форму ниже:

Операции с массивами

Поначалу синтаксис массивов Bash может показаться немного странным, но он станет более понятным после прочтения этой статьи.

Справочные элементы

Чтобы ссылаться на один элемент, вам нужно знать индекс элемента.

На любой элемент можно ссылаться, используя следующий синтаксис:

Напечатаем элемент с индексом 1 :

Если вы используете @ или * в качестве индекса, слово распространяется на всех членов массива. Чтобы напечатать все элементы, вы бы использовали:

Единственная разница между @ и * заключается в том, когда форма $ окружена двойными кавычками. В этом случае * расширяется до одного слова, где элементы массива разделяются пробелом. @ расширяет каждый элемент массива до отдельного слова. Это особенно важно при использовании формы для неграмотных элементов массива.

Чтобы напечатать ключи массива, добавьте ! оператор перед именем массива:

Длина массива

Чтобы получить длину массива, используйте следующую форму:

Цикл по массиву

Наиболее распространенный способ перебора каждого элемента в массиве — использование цикла for :

Код выше будет перебирать массив и печатать каждый элемент в новой строке:

Вот пример того, как распечатать все ключи и значения:

Другой способ перебрать массив — получить длину массива и использовать C style цикл:

Добавить новый элемент

Чтобы добавить новый элемент в массив bash и указать его индекс, используйте следующую форму:

Еще один способ добавления нового элемента в массив без указания индекса — использование += оператора. Вы можете добавить один или несколько элементов:

Удалить элемент

Чтобы удалить один элемент, вам нужно знать индекс элемента. Элемент можно удалить с помощью unset команды:

Давайте посмотрим на пример:

Вывод

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

Источник

Массивы bash

Предлагаю вашему вниманию перевод статьи Митча Фрейзера (Mitch Frazier) «Bash Arrays» с сайта linuxjournal.com.

Если вы используете «стандартную» оболочку *NIX-системы, возможно, вы не знакомы с такой полезной особенностью bash как массивы. Хотя массивы в bash не так круты, как в P-языках (Perl, Python и PHP) и других языках программирования, они часто бывают полезны.
Bash-массивы имеют только численные индексы, но они не обязательны к использованию, то есть вы не должны определять значения всех индексов в явном виде. Массив целиком может быть определен путем заключения записей в круглые скобки:

Отдельные записи могут быть определены с помощью знакомого всем синтаксиса (от Бейсика (да простит меня Дейкстра — прим. переводчика) до Фортрана):

Правда, обратное выглядит сравнительно более уродливо. Если нужно обратиться к определенной записи, тогда:

Из страницы man:

«Фигурные скобки нужны для предотвращения конфликтов при разворачивании полных путей к файлам.«

Кроме того, доступны следующие странноватые конструкции:

$ — сравнительно новое дополнение в bash и не является частью оригинальной реализации. Следующая конструкция демонстрирует пример простого использования массива. Обратите внимание на «[index]=value», это позволяет назначить конкретное значение конкретному номеру записи.

Запуск скрипта породит следующий вывод:

one
two
three
four
five

Array items and indexes:

0: one
1: two
2: three
3: four
5: five

Обратите внимание, что символ «@» может быть использован вместо «*» в конструкциях типа , результат будет одинаковым за исключением разворачивания записи в кавычках. «$*» и «$@» выведут записи в кавычках, «$» вернет каждую запись как одно слово, «$» вернет каждую запись в виде отдельных слов.

Следующий пример покажет, как кавычки и конструкции без кавычек возвращают строки (особенно важно, когда в этих строках есть пробелы):

Вывод при запуске:

Number of items in original array: 4

first item
second item
third
item

After unquoted expansion: 6

first
item
second
item
third
item

After * quoted expansion: 1

first item second item third item

After @ quoted expansion: 4

first item
second item
third
item

Источник

Массивы в Bash

Массивы — одна из наиболее часто используемых и фундаментальных структур данных. Вы можете думать о массиве как о переменной, которая может хранить в себе несколько переменных.

В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в сценариях Bash.

Bash массивы

Bash поддерживает одномерные типы массивов с числовым индексом и ассоциативные массивы. Для ссылок на числовые массивы используются целые числа, а для ассоциативных ссылок — с помощью строк.

Доступ к массивам с числовым индексом можно получить с конца, используя отрицательные индексы, индекс -1 ссылается на последний элемент. Индексы не обязательно должны быть смежными.

В отличие от большинства языков программирования, элементы массива Bash не обязательно должны иметь один и тот же тип данных. Вы можете создать массив, содержащий как строки, так и числа.

Bash не поддерживает многомерные массивы, и у вас не может быть элементов массива, которые также являются массивами.

Нет ограничений на максимальное количество элементов, которые могут храниться в массиве.

Создание массивов в Bash

Массивы в Bash можно инициализировать по-разному.

Создание массивов с числовой индексацией

Переменные Bash не типизированы, любая переменная может использоваться как индексированный массив без ее объявления.

Чтобы явно объявить массив, используйте встроенную команду declare:

Один из способов создать индексированный массив — использовать следующую форму:

Где index_* — положительное целое число.

Другой способ создать числовой массив — указать список элементов в круглых скобках, разделенных пустым пространством:

Когда массив создается с использованием формы выше, индексация начинается с нуля, то есть первый элемент имеет индекс 0 .

Создание ассоциативных массивов

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

Чтобы объявить ассоциативный массив, используйте встроенную команду declare с параметром -A (верхний регистр):

Ассоциативные массивы можно создавать, используя следующую форму:

Где index_* может быть любой строкой.

Вы также можете создать ассоциативный массив, используя форму ниже:

Операции с массивами

Синтаксис массивов Bash сначала может показаться немного странным, но, когда вы прочтете эту статью, он станет более понятным.

Справочные элементы

Чтобы ссылаться на один элемент, вам необходимо знать индекс элемента.

На любой элемент можно ссылаться, используя следующий синтаксис:

Распечатаем элемент с индексом 1 :

Если вы используете @ или * в качестве индекса, слово расширяется до всех членов массива. Чтобы распечатать все элементы, вы должны использовать:

Единственная разница между @ и * состоит в том, что форма $ двойные кавычки. В этом случае * заменяется одним словом, в котором элементы массива разделены пробелом. @ расширяет каждый элемент массива до отдельного слова. Это особенно важно при использовании формы для безграмотного просмотра элементов массива.

Чтобы распечатать ключи массива, добавьте ! оператор перед именем массива:

Длина массива

Чтобы получить длину массива, используйте следующую форму:

Прокрутите массив

Наиболее распространенный способ перебора каждого элемента в массиве — использование цикла for :

Приведенный выше код будет перебирать массив и печатать каждый элемент в новой строке:

Вот пример того, как распечатать все ключи и значения:

Другой способ перебрать массив — получить длину массива и использовать цикл в C style

Добавить новый элемент

Чтобы добавить новый элемент в массив bash и указать его индекс, используйте следующую форму:

Другой способ добавления нового элемента в массив без указания индекса — использование оператора += . Вы можете добавить один или несколько элементов:

Удалить элемент

Чтобы удалить один элемент, вам нужно знать индекс элемента. Элемент можно удалить с помощью команды unset :

Посмотрим на пример:

Выводы

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

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Читайте также:  Чем можно отмыть мастику с машины
Оцените статью