Linux массивы в bash

Массивы bash

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

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

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

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

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

 $ # Все записи в массиве $# Все индексы в массиве $# Количество записей в массиве $# Длина первой записи (нумерация с нуля) 

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

#!/bin/bash array=(one two three four [5]=five) echo "Array size: $" # Выводим размер массива echo "Array items:" # Выводим записи массива for item in $ do printf " %s\n" $item done echo "Array indexes:" # Выводим индексы массива for index in $ do printf " %d\n" $index done echo "Array items and indexes:" # Выводим записи массива с их индексами for index in $ do printf "%4d: %s\n" $index $ done 

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

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

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

Читайте также:  Удалить линукс минт терминала

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

#!/bin/bash array=("first item" "second item" "third" "item") echo "Number of items in original array: $" for ix in $ do printf " %s\n" "$" done echo arr=($) echo "After unquoted expansion: $" for ix in $ do printf " %s\n" "$" done echo arr=("$") echo "After * quoted expansion: $" for ix in $ do printf " %s\n" "$" done echo arr=("$") echo "After @ quoted expansion: $" for ix in $ do printf " %s\n" "$" done 

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:

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

array_name[index_1]=value_1 array_name[index_2]=value_2 array_name[index_n]=value_n 

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

Читайте также:  Xiaomi unlock tool linux

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

array_name=( element_1 element_2 element_N ) 

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

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

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

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

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

declare -A array_name array_name[index_foo]=value_foo array_name[index_bar]=value_bar array_name[index_xyz]=value_xyz 

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

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

declare -A array_name array_name=( [index_foo]=value_foo [index_bar]=value_bar [index_xyz]=value_xyz ) 

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

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

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

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

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

Синтаксис доступа к элементу массива аналогичен синтаксису большинства языков программирования. Фигурные скобки $<> необходимы, чтобы избежать операторов раскрытия имени файла оболочки.

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

## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## print element echo $my_array[1]> 

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

## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## print all elements echo "$my_array[@]>" 
Hydrogen Helium Lithium Beryllium 

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

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

## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## print all elements echo "$!my_array[@]>" 

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

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

## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## array Length echo $my_array[@]> 

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

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

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## Array Loop for i in "$my_array[@]>" do echo "$i" done 

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

Hydrogen Helium Lithium Beryllium 

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

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## Array Loop for i in "$!my_array[@]>" do echo "$i" "$my_array[$i]>" done 
0 Hydrogen 1 Helium 2 Lithium 3 Beryllium 

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

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) # Length of the array length=$my_array[@]> # Array Loop for (( i=0; i < $length>; i++ )) do echo $i $my_array[$i]> done 
0 Hydrogen 1 Helium 2 Lithium 3 Beryllium 

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

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

my_array[index_n]="New Element" 
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## add new element my_array[9]="Aluminum" ## print all elements echo "$my_array[@]>" 
Hydrogen Helium Lithium Beryllium Aluminum 

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

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## add new elements my_array+=( Cobalt Nickel ) ## print all elements echo "$my_array[@]>" 
Hydrogen Helium Lithium Beryllium Cobalt Nickel 

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

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

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## remove element unset my_array[2] ## print all elements echo "$my_array[@]>" 
Hydrogen Helium Beryllium 

Выводы

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

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

Источник

Оцените статью
Adblock
detector