В Bash массив может быть индексированным или ассоциативным массивом. Индексированный массив — это список, элементы которого нумеруются, начиная с нуля. Ассоциативный массив — это список, в котором строки заменили числа. Предположим, на учебном столе есть ручка, тетрадь, учебник, линейка, 42 доллара и карандаш. Эти 6 пунктов можно записать в виде списка следующим образом:
- pen
- exercise book
- textbook
- ruler
- 42
- pencil
Это пример индексированного массива. Всего 6 элементов, но они пронумерованы от нуля до 5. Такая нумерация является индексированием. Подсчет индекса в Bash начинается с нуля, а не с 1.
Каждый из этих продуктов изготовлен из какого-то основного материала. Список основного материала, за которым следует его готовый продукт:
ink => pen
soft paper => exercise book
hard paper => textbook
plastic => ruler
special paper => 42
wood => pencil
Это пример ассоциативного массива. Недостаточно просто ввести эти массивы в файл Bash. Необходимо кодировать любой из различных типов массивов. Кодирование индексированного массива аналогично кодированию ассоциативного массива. Однако есть небольшие, но важные отличия. В этой статье подробно рассматриваются массивы Bash.
- Индексированный массив
- Ссылка на индексированный элемент
- Положительные индексы
- Отрицательные индексы
- Отображение всех элементов в индексированном массиве
- Отображение индексов индексированного массива
- Длина индексированного массива
- Количество элементов индексированного массива
- Отображение только элементов набора индексированных массивов
- Установка и удаление индексированных элементов и их массива
- Ассоциативный массив
- Создание ассоциативного массива
- Ссылка на элемент ассоциативного массива
- Отображение всех значений в ассоциативном массиве
- Отображение всех ключей ассоциативного массива
- Количество элементов ассоциативного массива
- Отображение только элементов набора ассоциативных массивов
- Установка и удаление элементов ассоциативного массива и его массива
- Отображение значений связанного массива
- Заключение
Индексированный массив
Создание индексированного массива
Один из способов создания массива с указанным выше индексом заключается в следующем:
arr=(pen ‘exercise book’ «textbook» ruler 42 pencil)
Здесь arr — это имя массива. Программист мог бы назвать другое имя. Пробелы разделяют разные элементы в списке массива. Если элемент состоит из более чем одного слова, он вводится в одинарные или двойные кавычки. Индекс пера равен 0; индекс «тетради» — 1; индекс «учебник» — 2; индекс линейки — 3; индекс для 42 равен 4; индекс карандаша — 5.
Другой способ создания указанного выше массива начинается следующим образом:
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]=pencilecho ${#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]=pencilfor 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
Опять же, порядок, в котором значения кодируются в ассоциативном массиве, не обязательно должен совпадать с порядком, в котором они отображаются. Обратите внимание, что @ используется вместо * для переменной списка. Кроме того, для переменной списка использовались двойные кавычки.
Заключение
Массив — это список, пронумерованный или снабженный ключами. Когда массив пронумерован, это индексированный массив. Когда значения расположены по ключам, это ассоциативный массив. В индексированном массиве нумерация начинается с нуля. При вычислениях массив должен быть закодирован. Программисту нужно знать, как создать массив. Ему нужно знать, как добавлять элементы в массив и удалять элементы из массива. Ему нужно уметь определять количество элементов в массиве. И ему нужно знать, как удалить массив.
а что такое «включение по переуступке»
в чем смысл ?