Подробное описание массивов Bash

Подробное описание массивов Bash Изучение

В Bash массив может быть индексированным или ассоциативным массивом. Индексированный массив — это список, элементы которого нумеруются, начиная с нуля. Ассоциативный массив — это список, в котором строки заменили числа. Предположим, на учебном столе есть ручка, тетрадь, учебник, линейка, 42 доллара и карандаш. Эти 6 пунктов можно записать в виде списка следующим образом:

  1. pen
  2. exercise book
  3. textbook
  4. ruler
  5. 42
  6. pencil

Это пример индексированного массива. Всего 6 элементов, но они пронумерованы от нуля до 5. Такая нумерация является индексированием. Подсчет индекса в Bash начинается с нуля, а не с 1.

Каждый из этих продуктов изготовлен из какого-то основного материала. Список основного материала, за которым следует его готовый продукт:

ink => pen
soft paper => exercise book
hard paper => textbook
plastic => ruler
special paper => 42
wood => pencil

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

Содержание
  1. Индексированный массив
  2. Ссылка на индексированный элемент
  3. Положительные индексы
  4. Отрицательные индексы
  5. Отображение всех элементов в индексированном массиве
  6. Отображение индексов индексированного массива
  7. Длина индексированного массива
  8. Количество элементов индексированного массива
  9. Отображение только элементов набора индексированных массивов
  10. Установка и удаление индексированных элементов и их массива
  11. Ассоциативный массив
  12. Создание ассоциативного массива
  13. Ссылка на элемент ассоциативного массива
  14. Отображение всех значений в ассоциативном массиве
  15. Отображение всех ключей ассоциативного массива
  16. Количество элементов ассоциативного массива
  17. Отображение только элементов набора ассоциативных массивов
  18. Установка и удаление элементов ассоциативного массива и его массива
  19. Отображение значений связанного массива
  20. Заключение

Индексированный массив

Создание индексированного массива

Один из способов создания массива с указанным выше индексом заключается в следующем:

arr=(pen ‘exercise book’ «textbook» ruler 42 pencil)

Здесь arr — это имя массива. Программист мог бы назвать другое имя. Пробелы разделяют разные элементы в списке массива. Если элемент состоит из более чем одного слова, он вводится в одинарные или двойные кавычки. Индекс пера равен 0; индекс «тетради» — 1; индекс «учебник» — 2; индекс линейки — 3; индекс для 42 равен 4; индекс карандаша — 5.

Читайте также:  Тенденции цифровой трансформации здравоохранения в 2022 году

Другой способ создания указанного выше массива начинается следующим образом:

arr[2]=«textbook»

То есть создается массив, начиная с любого элемента в списке. «2» в квадратных скобках называется нижним индексом. Другие элементы могут быть включены позже, а именно:

arr[0]=pen
arr[1]=‘exercise book’
arr[3]=ruler
arr[4]=42
arr[5]=pencil

Обратите внимание, что во включении элемент индекса 2 не повторялся.

Другой способ создания указанного выше массива выглядит следующим образом:

declare -a arr

Здесь «объявить» — зарезервированное слово. ’-a’ означает индексированный массив. «Arr» — имя по выбору программиста. Затем все элементы могут быть включены следующим образом:

arr[0]=pen
arr[1]=‘exercise book’
arr[2]=«textbook»
arr[3]=ruler
arr[4]=42
arr[5]=pencil

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

Ссылка на индексированный элемент

Синтаксис ссылки на элемент:

${name[subscript]}

Где name — это имя массива, например arr. Нижний индекс — это целое число (число).

Положительные индексы

Подсчет индекса обычно начинается с нуля. В следующем коде значения элементов считываются и отображаются:

arr=(pen ‘exercise book’ «textbook» ruler 42 pencil)

for ((i=0; i < 6; ++i))do
echo ${arr[i]}
done

Результат:

pen
exercise book
textbook
ruler
42
pencil

Шесть элементов начинаются с индекса 0 до индекса 5. Итак, итерация выполняется 6 раз, а не 5 раз.

Отрицательные индексы

Отрицательные индексы могут использоваться для доступа к элементам. В этом случае −1 относится к последнему элементу; −2 относится к предпоследнему элементу; −3 относится к элементу перед предпоследним элементом и так далее. Итак, для указанного выше массива −6 относится к первому элементу. Следующий код иллюстрирует это:

arr=(pen ‘exercise book’ «textbook» ruler 42 pencil)

for ((i=-1; i >-6; —i))do
echo ${arr[i]}
done

Результат:

pencil
42
ruler
textbook
exercise book
pen

Дисплей в обратном порядке.

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

Чтобы отобразить все элементы, можно использовать $ {name [*]} или $ {name [@]}. В этих выражениях вместо индекса стоит * или @. И при этом вместо возврата значений элементов возвращаются значения элементов, присутствующих в массиве. Следующий код иллюстрирует это:

declare -a arr
arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil
echo ${arr[@]}
echo ${arr[*]}

На выходе получается,
тетрадь линейка карандаш
тетрадь линейка карандаш

Обратите внимание, что символы @ и *, используемые таким образом, являются синонимами. Проблема с выводом: фразы разделены пробелами и не различаются. Следующий код должен разделять фразы запятыми:

declare -a arr
arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil
IFS=,
echo «${arr[@]}«
echo «${arr[*]}«

Теперь вывод:

тетрадь линейка карандаш
тетрадь, линейка, карандаш

IFS означает внутренний разделитель полей. Ему поставлена ​​запятая. Обратите внимание на использование двойных кавычек для $ {arr [@]} и $ {arr [*]} в командах echo. Запятые включены в нижний индекс *, а не в нижний индекс @. Есть еще одна проблема: во второй строке вывода, где использовались запятые, пробелы не отображались. Итак, @ и * не всегда являются синонимами. Однако их можно разделить запятой и пробелом — см. Ниже.

Отображение индексов индексированного массива

Выражение $ {! Name [@]} или $ {! Name [*]} возвращает индексы массива в виде списка, разделенного пробелами. Обратите внимание на использование и расположение восклицательного знака (!). В следующем коде показано использование этих выражений:

arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil

echo ${!arr[@]}
echo ${!arr[*]}

Результат:
1 3 5
1 3 5

Длина индексированного массива

Длина массива определяется как:

${#name[subscript]}

Где name — это имя, такое как arr, которое программист дал массиву; нижний индекс — это самый высокий индекс (длина — 1) для элемента, значение которого установлено. Обратите внимание на использование и положение символа #. Следующий код иллюстрирует это:

arr=(pen ‘exercise book’ «textbook» ruler 42 pencil)

echo ${#arr[5]}

Результатом будет 6. Даже если некоторые или все нижние элементы отсутствуют, длина все равно будет равна high_index + 1. Следующий код иллюстрирует это:

declare -a arr

arr[3]=ruler
arr[5]=pencil

echo ${#arr[5]}

На выходе по-прежнему будет 6, даже если элемента нет, для индекса 0, индекса 1, индекса 2 и индекса 4.

Количество элементов индексированного массива

Как видно выше, количество элементов в массиве может быть меньше длины массива. Это связано с тем, что значения некоторых элементов ниже последнего элемента не были созданы или были сброшены. Выражение дает количество элементов, которые установлены в индексированном массиве, $ {# arr [@]} или $ {# arr [*]}, как показано в следующем коде:

arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil

echo ${#arr[@]}
echo ${#arr[*]}

Результат:

3
3

Отображение только элементов набора индексированных массивов

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

arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil

for ((i=0; i < ${#arr[5]}; ++i))do
if [ ! -z «${arr[i]}« ]then
printf «${arr[i]}, «
fi
done
echo

Результат:

exercise book, ruler, pencil

Обратите внимание, как неустановленные элементы были идентифицированы и исключены из итерации в условии. Также обратите внимание, что в условии $ {arr [i]} заключен в двойные кавычки как «$ {arr [i]}», чтобы значения, содержащие пробелы, могли быть напечатаны. Команда printf похожа на команду echo, но не добавляет новую строку после отображения. Значения на выходе можно было разделить запятой и пробелом в одной строке. Последнее эхо приведет к тому, что следующий вывод перейдет на следующую строку.

Более простая форма приведенного выше кода выглядит следующим образом:

arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil

for i in ${!arr[@]}do
printf «${arr[i]}, «
done
echo

Выход такой же. Обратите внимание на выражение для списка после зарезервированного слова, in. Это выражение возвращает список индексов. Таким образом, здесь нет необходимости в условии if.

Установка и удаление индексированных элементов и их массива

Любой проиндексированный элемент, которому не было присвоено значение, не устанавливается. Устанавливается индексированный элемент, которому присвоено значение. Теперь элемент может быть намеренно отключен, как показано в следующем сценарии:

arr[1]=‘exercise book’ arr[3]=ruler arr[5]=pencil

unset arr[3]

for i in ${!arr[@]}do
printf «${arr[i]}, «
done
echo

Результат:

exercise book, pencil

«Линейка» не отображается. Синтаксис для отмены установки элемента:

unset arrayName[subscript]

Синтаксис для удаления или сброса всего массива:

unset arrayName

или же

unset arrayName[@]

или же

unset arrayName[*]

В следующем коде не задан весь массив:

arr=(pen ‘exercise book’ «textbook» ruler 42 pencil)

unset arr

echo «${arr[*]}«

На выходе ничего нет (пустая строка), потому что весь массив не установлен.

Ассоциативный массив

Как указано выше, примером ассоциативного массива, написанного на бумаге, является:

ink => pen
soft paper => exercise book
hard paper => text book
plastic => ruler
special paper => 42
wood => pencil

Есть 6 элементов, каждый из которых состоит из пары ключ / значение. Для первого элемента «чернила» — это ключ, а «перо» — это значение; для второго элемента «мягкая бумага» является ключом, а «тетрадь» — значением; и так далее.

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

Один из способов создания указанного выше массива заключается в следующем:

declare -A arr=([ink]=pen [soft paper]=‘exercise book’ [hard paper]=«text book» [plastic]=ruler [special paper]=42 [wood]=pencil)

Здесь arr — это имя массива. Программист мог бы назвать другое имя. Различные элементы в списке массива разделяются пробелами. Если значение состоит из более чем одного слова, оно вводится в одинарные или двойные кавычки. Ключ может состоять более чем из одного слова. В этом кодированном ассоциативном массиве 6 пар ключ / значение. Ключ заключен в квадратные скобки. Значение присваивается ключу с помощью оператора присваивания. ’-A’ означает ассоциативный массив, и он должен быть там.

Другой способ создания указанного выше массива начинается следующим образом:

declare -A arr

Здесь «объявить» — зарезервированное слово. ’-A’ означает ассоциативный массив (а ’-a’ означает индексированный массив). «Arr» — имя по выбору программиста. Затем элементы могут быть включены следующим образом:

declare -A arr

arr[soft paper]=‘exercise book’
arr[plastic]=ruler
arr[wood]=pencil

Все элементы (6) не обязательно должны быть включены одновременно. Остальное можно будет добавить позже. Это добавление по назначению. Помните, что когда переменной присваивается какое-либо значение, не должно быть пробелов между оператором присваивания = и переменной или значением.

Ссылка на элемент ассоциативного массива

Синтаксис ссылки на элемент ассоциативного массива:

${name[subscript]}

Где name — это имя массива, например arr. Подстрочный индекс — это ключ в текстовой форме. В следующем коде значения элементов считываются и отображаются:

declare -A arr=([ink]=pen [soft paper]=‘exercise book’ [hard paper]=«textbook» [plastic]=ruler [special paper]=42 [wood]=pencil)

echo ${arr[ink]}
echo ${arr[soft paper]}
echo ${arr[hard paper]}
echo ${arr[plastic]}
echo ${arr[special paper]}
echo ${arr[wood]}

Результат:

pen
exercise book
textbook
ruler
42
pencil

Отображение всех значений в ассоциативном массиве

Для отображения всех значений можно использовать $ {name [*]} или $ {name [@]}. В этих выражениях вместо ключа стоит * или @. И при этом вместо возврата значений элементов возвращаются значения элементов, присутствующих в массиве. Следующий код иллюстрирует это:

declare -A arr

arr[soft paper]=‘exercise book’ arr[plastic]=ruler arr[wood]=pencil

echo ${arr[@]}
echo ${arr[*]}

Результат:

pencil exercise book ruler
pencil exercise book ruler

Порядок значений на выходе не обязательно должен соответствовать порядку в ассоциативном массиве. Обратите внимание, что символы @ и *, используемые таким образом, являются синонимами. Проблема с выводом: фразы разделены пробелами и не различаются. Следующий код разделяет фразы запятыми:

declare -A arr

arr[soft paper]=‘exercise book’ arr[plastic]=ruler arr[wood]=pencil
IFS=,
echo «${arr[@]}«
echo «${arr[*]}«

Теперь вывод:

pencil exercise book ruler
pencil, exercise book, ruler

IFS означает внутренний разделитель полей. Ему поставлена ​​запятая. Обратите внимание на использование двойных кавычек для $ {arr [@]} и $ {arr [*]} в командах echo. Запятые включены в нижний индекс *, а не в нижний индекс @. Есть еще одна проблема: во второй строке вывода, где использовались запятые, пробелы не отображались. Итак, @ и * не всегда являются синонимами. Ну, можно разделить запятой и пробелом — см. Ниже.

Отображение всех ключей ассоциативного массива

Выражение $ {! Name [@]} или $ {! Name [*]} возвращает ключи массива в виде списка, разделенного пробелами. Обратите внимание на использование и расположение восклицательного знака (!). В следующем коде показано использование этих выражений:

declare -A arr

arr[soft paper]=‘exercise book’ arr[plastic]=ruler arr[wood]=pencil

echo ${!arr[@]}
echo ${!arr[*]}

Результат:

wood soft paper plastic
wood soft paper plastic

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

Количество элементов ассоциативного массива

Выражение дает количество элементов, которые установлены в ассоциативном массиве, $ {# arr [@]} или $ {# arr [*]}, как показано в следующем коде:

declare -A arr

arr[soft paper]=‘exercise book’ arr[plastic]=ruler arr[wood]=pencil

echo ${#arr[@]}
echo ${#arr[*]}

Результат:

3
3

Обратите внимание на использование и положение символа #.

Отображение только элементов набора ассоциативных массивов

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

declare -A arr

arr[ink]=pen
${arr[soft paper]}; arr[soft paper]=‘exercise book’
${arr[hard paper]}
arr[plastic]=ruler
${arr[special paper]}
arr[wood]=pencil

for key in «${!arr[@]}«do
printf «${arr[$key]}, «
done
echo

Результат:

pencil, exercise book, pen, ruler,

Опять же, выходное позиционирование не в том порядке, который был закодирован. Обратите внимание, что «$ {! Arr [@]}» заключено в двойные кавычки, поэтому значения, содержащие пробелы, могут быть напечатаны. Обратите внимание, что в $ {arr [$ key]} ключу предшествует $. Команда printf похожа на команду echo, но не добавляет новую строку после отображения. Значения на выходе можно было разделить запятой и пробелом в одной строке. Последнее эхо приведет к тому, что следующий вывод перейдет на следующую строку.

Установка и удаление элементов ассоциативного массива и его массива

Любой ключевой элемент, которому не присвоено значение, не устанавливается. Устанавливается ключевой элемент, которому присвоено значение. Теперь элемент может быть намеренно отключен, как показано в следующем сценарии:

declare -A arr

arr[soft paper]=‘exercise book’ arr[plastic]=ruler arr[wood]=pencil

unset arr[plastic]

for key in «${!arr[@]}«do
printf «${arr[$key]}, «
done
echo

Результат:

pencil, exercise book,

«Линейка» не отображается. Синтаксис для отмены установки элемента:

unset arrayName[key]

Синтаксис для удаления или сброса всего ассоциативного массива:

unset arrayName

или же

unset arrayName[@]

или же

unset arrayName[*]

В следующем коде не задан весь массив:

declare -A arr=([ink]=pen [soft paper]=‘exercise book’ [hard paper]=«text book» [plastic]=ruler [special paper]=42 [wood]=pencil)

unset arr

echo «${arr[*]}«

На выходе ничего нет (пустая строка), потому что весь массив не установлен.

Отображение значений связанного массива

declare -A arr=([ink]=pen [soft paper]=‘exercise book’ [hard paper]=«text book» [plastic]=ruler [special paper]=42 [wood]=pencil)

for value in «${arr[@]}«do
echo $value
done

Результат:

pencil
42
exercise book
textbook
pen
ruler

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

Заключение

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

Оцените статью
bestprogrammer.ru
Добавить комментарий

  1. Алексей

    а что такое «включение по переуступке»
    в чем смысл ?

    Ответить