Bash вывести элемент массива

Содержание
  1. Глава 25. Массивы
  2. Массивы Bash Arrays
  3. Bash Arrays
  4. В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в ваших скриптах Bash.
  5. Bash Arrays
  6. Создание массивов Bash
  7. Создание численно проиндексированных массивов
  8. Создание ассоциативных массивов
  9. Операции с массивами
  10. Справочные элементы
  11. Длина массива
  12. Цикл по массиву
  13. Добавить новый элемент
  14. Удалить элемент
  15. Вывод
  16. Массивы в Bash
  17. Bash массивы
  18. Создание массивов в Bash
  19. Создание массивов с числовой индексацией
  20. Создание ассоциативных массивов
  21. Операции с массивами
  22. Справочные элементы
  23. Длина массива
  24. Прокрутите массив
  25. Добавить новый элемент
  26. Удалить элемент
  27. Выводы
  28. Массивы в Bash
  29. Определение массивов в Bash
  30. Синтаксис работы с массивами
  31. Обход элементов массива в цикле
  32. Работа с массивами в bash
  33. Реальная задача, в которой пригодятся bash-массивы
  34. Основы
  35. Способы обращения к элементам массивов
  36. Перебор элементов массивов в циклах
  37. Перебор индексов массивов в циклах
  38. Заполнение массивов
  39. Полезные синтаксические конструкции
  40. Решение задачи
  41. Что дальше?
  42. Оповещения о проблемах
  43. Запросы к API
  44. Bash или Python?
  45. Итоги

Глава 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

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

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

Bash массивы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выводы

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

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

Источник

Массивы в Bash

Определение массивов в Bash

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

Для объявления массива необходимо придумать имя идентификатора и указать в круглых скобках () список принимаемых значений. Значения с пробелом необходимо заключать в кавычки.

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

Синтаксис работы с массивами

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

$ fruits_array.sh
orange apple star fruit banana

Для обращения к нескольким элементам массива используйте синтаксис $ , где n — количество элементов начиная с элемента под индексом — s .

$ fruits_array.sh
apple star fruit

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

$ fruits_array.sh
orange apple star fruit banana aprycot

Узнать количество элементов в массиве $ <#array[@]>.

В массив можно сохранить результаты вывода команд.

$ folders_array.sh
Desktop Documents Downloads Music Pictures Public

Обход элементов массива в цикле

Используя цикл for можно обойти все элементы в массиве.

Чтобы обойти индексы элементов массива, добавьте знак ! к началу идентификатора.

Источник

Работа с массивами в bash

Программисты регулярно пользуются bash для решения множества задач, сопутствующих разработке ПО. При этом bash-массивы нередко считаются одной из самых непонятных возможностей этой командной оболочки (вероятно, массивы уступают в этом плане лишь регулярным выражениям). Автор материала, перевод которого мы сегодня публикуем, приглашает всех желающих в удивительный мир bash-массивов, которые, если привыкнуть к их необычному синтаксису, могут принести немало пользы.

Реальная задача, в которой пригодятся bash-массивы

Писать о bash — занятие неоднозначное. Дело в том, что статьи о bash нередко превращаются в руководства пользователя, которые посвящены рассказам о синтаксических особенностях рассматриваемых команд. Эта статья написана иначе, надеемся, вам она не покажется очередным «руководством пользователя».

Учитывая вышесказанное, представим себе реальный сценарий использования массивов в bash. Предположим, перед вами стоит задача оценить и оптимизировать утилиту из нового внутреннего набора инструментов, используемого в вашей компании. На первом шаге этого исследования вам нужно испытать её с разными наборами параметров. Испытание направлено на изучение того, как новый набор инструментов ведёт себя при использовании им разного количества потоков. Для простоты изложения будем считать, что «набор инструментов» — это скомпилированный из C++-кода «чёрный ящик». При его использовании единственным параметром, на который мы можем влиять, является число потоков, зарезервированных для обработки данных. Вызов исследуемой системы из командной строки выглядит так:

Основы

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

В этом примере все элементы являются числами, но, на самом деле, в bash-массивах можно хранить одновременно и числа, и строки. Например, вполне допустимо объявление такого массива:

Как и в случае с другими переменными bash, обратите внимание на то, чтобы вокруг знака = не было бы пробелов. В противном случае bash сочтёт имя переменной именем программы, которую ему нужно выполнить, а = — её первым аргументом!

Теперь, когда мы инициализировали массив, давайте извлечём из него несколько элементов. Тут можно заметить, например, что команда echo $allThreads выведет лишь первый элемент массива.

Для того чтобы понять причины такого поведения, немного отвлечёмся от массивов и вспомним, как работать с переменными в bash. Рассмотрим следующий пример:

Предположим, что имеется переменная $type , которая содержит строку, представляющую собой имя существительное. После этого слова надо добавить букву s . Однако нельзя просто добавить эту букву в конец имени переменной, так как это превратит команду обращения к переменной в $types , то есть, работать мы уже будем с совершенно другой переменной. В данной ситуации можно воспользоваться конструкцией вида echo «Found 42 «$type»s» . Но лучше всего решить эту задачу с использованием фигурных скобок: echo «Found 42 $s» , что позволит нам сообщить bash о том, где начинается и заканчивается имя переменной (что интересно, тот же синтаксис используется в JavaScript ES6 для внедрения переменных в выражения в шаблонных строках).

Теперь вернёмся к массивам. Оказывается, что, хотя фигурные скобки при работе с переменными обычно не нужны, они нужны для работы с массивами. Они позволяют задавать индексы для доступа к элементам массива. Например, команда вида echo $ выведет второй элемент массива. Если в вышеописанной конструкции забыть о фигурных скобках, bash будет воспринимать [1] как строку и соответствующим образом обработает то, что получится.

Как видите, массивы в bash имеют странный синтаксис, но в них, по крайней мере, нумерация элементов начинается с нуля. Это роднит их с массивами из многих других языков программирования.

Способы обращения к элементам массивов

В вышеописанном примере мы использовали в массивах целочисленные индексы, задаваемые в явном виде. Теперь рассмотрим ещё два способа работы с массивами.

Первый способ применим в том случае, если нам нужен $i -й элемент массива, где $i — это переменная, содержащая индекс нужного элемента массива. Извлечь этот элемент из массива можно с помощью конструкции вида echo $ .

Второй способ позволяет вывести все элементы массива. Он заключается в замене числового индекса символом @ (его можно воспринимать как команду, указывающую на все элементы массива). Выглядит это так: echo $ .

Перебор элементов массивов в циклах

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

Перебор индексов массивов в циклах

Рассмотрим теперь несколько иной подход к перебору массивов. Вместо того, чтобы перебирать элементы, мы можем перебирать индексы массива:

Разберём то, что здесь происходит. Как мы уже видели, конструкция вида $ представляет собой все элементы массива. При добавлении сюда восклицательного знака мы превращаем эту конструкцию в $ , что приводит к тому, что она возвращает индексы массива (от 0 до 7 в нашем случае).

Другими словами, цикл for перебирает все индексы массива, представленные в виде переменной $i , а в теле цикла обращение к элементам массива, которые служат значениями параметра —thread , выполняется с помощью конструкции $ .

Читать этот код сложнее, чем тот, что приведён в предыдущем примере. Поэтому возникает вопрос о том, к чему все эти сложности. А нужно это нам из-за того, что в некоторых ситуациях, при обработке массивов в циклах, нужно знать и индексы и значения элементов. Скажем, если первый элемент массива нужно пропустить, перебор индексов избавит нас, например, от необходимости создания дополнительной переменной и от инкрементации её в цикле для работы с элементами массива.

Заполнение массивов

До сих пор мы исследовали систему, вызывая команду pipeline с передачей ей каждого интересующего нас значения параметра —threads . Теперь предположим, что эта команда выдаёт длительность выполнения некоего процесса в секундах. Нам хотелось бы перехватить возвращаемые ей на каждой итерации данные и сохранить в другом массиве. Это даст нам возможность работать с сохранёнными данными после того, как все испытания закончатся.

Полезные синтаксические конструкции

Прежде чем говорить о том, как добавлять данные в массивы, рассмотрим некоторые полезные синтаксические конструкции. Для начала нам нужен механизм получения данных, выводимых bash-командами. Для того чтобы захватить вывод команды, нужно использовать следующую конструкцию:

После выполнения этой команды то, что выведет скрипт myscript.sh , будет сохранено в переменной $output .

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

Решение задачи

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

Что дальше?

Только что мы рассмотрели способ использования bash-массивов для перебора параметров, используемых при запуске некоей программы и для сохранения данных, которые возвращает эта программа. Однако этим сценарием варианты использования массивов не ограничиваются. Вот ещё пара примеров.

Оповещения о проблемах

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

Запросы к API

Предположим, вы хотите собрать сведения о том, какие пользователи комментируют ваши публикации на Medium. Так как у нас нет прямого доступа к базе данных этой площадки, SQL-запросы обсуждать мы не будем. Однако, для доступа к данным такого рода можно использовать различные API.

Для того чтобы избежать долгих разговоров об аутентификации и токенах, будем, в качестве конечной точки, использовать общедоступное API сервиса JSONPlaceholder, ориентированного на тестирование. Получив от сервиса публикацию и вытащив из её кода данные по электронным адресам комментаторов, мы можем поместить эти данные в массив:

Обратите внимание на то, что здесь использовано средство jq, которое позволяет парсить JSON в командной строке. В подробности работы с jq мы тут вдаваться не будем, если вам этот инструмент интересен — посмотрите документацию по нему.

Bash или Python?

Массивы — возможность полезная и доступна она не только в bash. У того, кто пишет скрипты для командной строки, может возникнуть закономерный вопрос о том, в каких ситуациях стоит использовать bash, а в каких, например, Python.

На мой взгляд, ответ на этот вопрос кроется в том, насколько программист зависит от той или иной технологии. Скажем, если задачу можно решить прямо в командной строке, тогда ничто не препятствует использованию bash. Однако в том случае, если, например, интересующий вас скрипт является частью некоего проекта, написанного на Python, вы вполне можете воспользоваться Python.

Например, для решения рассмотренной здесь задачи можно воспользоваться и скриптом, написанным на Python, однако, это сведётся к написанию на Python обёртки для bash:

Пожалуй, решение этой задачи с помощью bash, без привлечения других технологий, получается короче и понятнее и здесь вполне можно обойтись без Python.

Итоги

В этом материале мы разобрали немало конструкций, использующихся для работы с массивами. Вот таблица, в которой вы найдёте то, что мы рассмотрели, и кое-что новое.

Синтаксическая конструкция Описание
arr=() Создание пустого массива
arr=(1 2 3) Инициализация массива
$ Получение третьего элемента массива
$ Получение всех элементов массива
$ Получение индексов массива
$ Вычисление размера массива
arr[0]=3 Перезапись первого элемента массива
arr+=(4) Присоединение к массиву значения
str=$(ls) Сохранение вывода команды ls в виде строки
arr=( $(ls) ) Сохранение вывода команды ls в виде массива имён файлов
$ Получение элементов массива начиная с элемента с индексом s до элемента с индексом s+(n-1)

На первый взгляд bash-массивы могут показаться довольно странными, но те возможности, которые они дают, стоят того, чтобы с этими странностями разобраться. Полагаем, что освоив bash-массивы, вы будете пользоваться ими довольно часто. Несложно представить себе бесчисленное множество сценариев, в которых эти массивы могут пригодиться.

Уважаемые читатели! Если у вас есть интересные примеры применения массивов в bash-скриптах — просим ими поделиться.

Источник

Читайте также:  Как отмыть солидол с железа
Оцените статью