Введение
В программировании часто требуется хранить список связанных элементов — например, имён файлов, идентификаторов пользователей или имён серверов. Вместо создания отдельной переменной для каждого элемента (например, file1, file2, file3) можно использовать одну переменную, называемую массивом.
Массив позволяет хранить несколько значений под одним именем. Его можно представить как список, в который можно добавлять, удалять и из которого можно считывать элементы.
Массивы становятся полезны, как только одной переменной оказывается недостаточно. Списки серверов, имена файлов, названия пакетов и учётные записи пользователей — примеры данных, которые естественным образом объединяются в группы, а не представлены одним значением.
В этой лабораторной работе вы научитесь:
- Объявлять массив с начальным набором значений.
- Добавлять новые элементы в массив.
- Выводить все элементы массива.
- Перебирать массив в цикле, обрабатывая каждый элемент отдельно.
Объявление массива
Начнём с создания сценария, который хранит список имён.
Массивы позволяют оболочке обрабатывать связанные значения как группу, а не хранить их в отдельных переменных. Это удобно, когда сценарий должен работать с коллекцией элементов, а не с одним значением.
Создайте сценарий array_lab.sh:
cd ~/project
nano array_lab.sh
Введите этот код, чтобы инициализировать массив:
#!/bin/bash
## Define an array named 'names'
names=("Alice" "Bob")
Правила синтаксиса:
- Используйте круглые скобки
()для заключения списка значений. - Разделяйте элементы пробелами, а не запятыми.
("Alice" "Bob")— правильная запись.("Alice", "Bob")— неправильная, потому что запятая будет считаться частью строки"Alice,".
Последний пункт отражает общее правило оболочки: синтаксис Bash часто выглядит простым, но небольшие различия в пунктуации меняют смысл. Массивы представляют собой списки, разделённые пробелами, а не запятыми, как в некоторых других языках.
Сохраните файл (Ctrl+O) и выйдите из редактора (Ctrl+X).
Проверьте содержимое файла:
cat array_lab.sh
Вы успешно определили переменную-массив, хотя сценарий пока ничего не выводит.
Добавление элемента в массив
Часто в начале работы неизвестны все элементы списка. В процессе выполнения сценария может потребоваться добавлять их динамически.
Это распространённый сценарий для реальных программ. Например, можно сформировать массив подходящих файлов, активных узлов, неисправных служб или названий пакетов, обнаруженных во время выполнения.
Добавить новый элемент в конец массива можно с помощью оператора +=.
Откройте сценарий:
nano array_lab.sh
Добавьте в конец файла следующую строку:
## Append 'Charlie' to the list
names+=("Charlie")
Пояснение:
+=означает «добавить к существующему значению».("Charlie")заключает новый элемент в круглые скобки, чтобы Bash обработал его как элемент массива.
Теперь файл должен выглядеть так:
#!/bin/bash
## Define an array named 'names'
names=("Alice" "Bob")
## Append 'Charlie' to the list
names+=("Charlie")
Сохраните файл и выйдите из редактора.
Вывод всех элементов
Чтобы проверить, что массив содержит все ожидаемые значения, можно вывести все его элементы одновременно.
В Bash обращение к переменной-массиву немного отличается от обращения к обычной переменной. Для раскрытия всех элементов используется ${array_name[@]}.
@— специальный символ, который означает «все элементы».
Форма ${...} — ещё один пример раскрытия параметра. Bash не выводит имя переменной буквально, а раскрывает массив в сохранённые элементы до того, как echo получит окончательный текст.
Откройте array_lab.sh:
nano array_lab.sh
Добавьте команду вывода:
## Print all elements in the array
echo "All Names: ${names[@]}"
Сохраните файл и выйдите из редактора.
Сделайте сценарий исполняемым и запустите его:
chmod +x array_lab.sh
./array_lab.sh
Результат:
All Names: Alice Bob Charlie
Выражение ${names[@]} раскрылось в список всех элементов массива, разделённых пробелами.
Перебор массива
Вывод всего списка удобен для отладки, но обычно требуется обрабатывать каждый элемент отдельно. Например, можно создать учётную запись пользователя для каждого имени из списка.
Для этого используется цикл for.
Откройте array_lab.sh:
nano array_lab.sh
Добавьте цикл в конец файла:
echo "--- Processing Names ---"
## Loop through each item in the array
for name in "${names[@]}"; do
echo "Hello, $name"
done
Теперь полный сценарий должен выглядеть так:
#!/bin/bash
names=("Alice" "Bob")
names+=("Charlie")
echo "All Names: ${names[@]}"
echo "--- Processing Names ---"
for name in "${names[@]}"; do
echo "Hello, $name"
done
Сохраните файл и выйдите из редактора. Запустите сценарий:
./array_lab.sh
Результат:
Кавычки вокруг "${names[@]}" также важны. Они сохраняют каждый элемент массива как отдельный элемент, что особенно важно, если значения содержат пробелы. В реальных сценариях это имеет ещё большее значение, поскольку имена файлов и аргументы не всегда состоят из одного слова.
All Names: Alice Bob Charlie
--- Processing Names ---
Hello, Alice
Hello, Bob
Hello, Charlie
Цикл взял из массива каждое имя, присвоил его переменной name и выполнил блок кода. Это наиболее распространённый способ работы со списками в Bash.
Итоги
В этой лабораторной работе вы изучили основы работы с массивами в Bash:
- Объявление (
name=(...)): создание списка с начальными значениями. - Добавление (
+=): динамическое добавление новых элементов в существующий массив. - Раскрытие (
${name[@]}): получение всех элементов массива. - Перебор (
for): последовательная обработка каждого элемента списка.
Массивы необходимы для эффективного написания сценариев, работающих с несколькими файлами, пользователями или точками данных.



