Сравнение массивов в Shell

ShellBeginner
Практиковаться сейчас

Введение

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

Создание файла скрипта

Для начала создадим новый файл для нашего сценария.

  1. Откройте терминал в WebIDE. Вы увидите командную строку, заканчивающуюся символом $.

  2. Перейдите в каталог проекта:

cd ~/project

Эта команда меняет текущую рабочую директорию на папку проекта. Символ ~ обозначает ваш домашний каталог, а /project — это подпапка внутри него.

  1. Создайте новый файл с именем array-comparison.sh:
touch array-comparison.sh

Команда touch создает пустой файл. Если файл уже существует, она просто обновит время его последнего изменения, не затрагивая содержимое.

  1. Откройте файл в редакторе WebIDE. Это можно сделать, щелкнув по имени файла в проводнике слева.

Добавление шебанга и инициализация массивов

Теперь приступим к написанию кода: добавим шебанг и инициализируем наши массивы.

  1. Добавьте следующее содержимое в файл array-comparison.sh:
#!/bin/bash

## Initialize the arrays
a=(3 5 8 10 6)
b=(6 5 4 12)
c=(14 7 5 7)

Разберем, что здесь происходит:

  • Первая строка #!/bin/bash называется шебангом (shebang). Она указывает системе, что для выполнения этого скрипта нужно использовать интерпретатор Bash. Эта строка критически важна для любого shell-скрипта.
  • Затем мы инициализируем три массива: a, b и c. В Bash массивы определяются путем заключения элементов в круглые скобки () через пробел.
  • Каждый массив содержит набор целых чисел. Мы будем использовать их для поиска пересекающихся значений.

Реализация первого цикла сравнения

Реализуем первый цикл сравнения, чтобы найти общие элементы между массивами a и b.

Добавьте следующий код в ваш скрипт:

## Initialize an array to store common elements between a and b
z=()

## Compare arrays a and b
for x in "${a[@]}"; do
  for y in "${b[@]}"; do
    if [ $x = $y ]; then
      z+=($x)
    fi
  done
done

echo "Common elements between a and b: ${z[@]}"

Подробное объяснение кода:

  • z=() инициализирует пустой массив z для хранения найденных общих элементов.
  • for x in "${a[@]}" — это цикл, который перебирает каждый элемент массива a. Синтаксис "${a[@]}" разворачивается во все элементы массива.
  • Внутри него находится вложенный цикл for y in "${b[@]}", который перебирает каждый элемент массива b.
  • if [ $x = $y ] проверяет, совпадает ли текущий элемент из a с текущим элементом из b.
  • Если они равны, мы добавляем этот элемент в массив z с помощью конструкции z+=($x).
  • В конце мы выводим найденные элементы с помощью echo "Common elements between a and b: ${z[@]}". Синтаксис ${z[@]} позволяет вывести все содержимое массива z.

Реализация второго цикла сравнения

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

Добавьте следующий код в скрипт:

## Initialize an array to store common elements among a, b, and c
j=()

## Compare array c with the common elements found in z
for i in "${c[@]}"; do
  for k in "${z[@]}"; do
    if [ $i = $k ]; then
      j+=($i)
    fi
  done
done

echo "Common elements among a, b, and c: ${j[@]}"

Этот код работает аналогично предыдущему, но с небольшими отличиями:

  • Мы инициализируем новый пустой массив j для хранения итоговых общих элементов.
  • Внешний цикл for i in "${c[@]}" перебирает элементы массива c.
  • Внутренний цикл for k in "${z[@]}" перебирает элементы, которые оказались общими для a и b.
  • Мы сравниваем элементы из c с элементами из z, и при совпадении добавляем их в массив j.
  • В завершение выводится список элементов, которые присутствуют во всех трех массивах.

Настройка прав доступа и запуск скрипта

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

  1. В терминале установите права на выполнение:
chmod +x ~/project/array-comparison.sh

Команда chmod изменяет права доступа к файлу. Опция +x добавляет право на выполнение, что позволяет запускать файл как программу.

  1. Запустите скрипт:
~/project/array-comparison.sh

Эта команда выполняет ваш сценарий. Часть ~/project/ указывает точный путь к файлу.

Вы должны увидеть вывод, похожий на этот:

Common elements between a and b: 5 6
Common elements among a, b, and c: 5

Этот результат подтверждает, что:

  • Общими элементами для массивов a и b являются 5 и 6.
  • Единственным общим элементом для всех трех массивов (a, b и c) является 5.

Если вы не видите такого вывода или получили ошибку, внимательно проверьте код на наличие опечаток или пропущенных символов.

Резюме

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

  1. Создание и инициализация массивов.
  2. Использование вложенных циклов для сопоставления данных.
  3. Применение условных операторов для проверки равенства.
  4. Динамическое добавление элементов в массив.
  5. Управление правами доступа и запуск скриптов.

эти навыки являются фундаментальными для Shell-скриптинга и могут быть применены в будущем для решения более сложных задач по обработке данных. Помните, что практика — залог успеха. Попробуйте изменить скрипт, чтобы он работал с другими данными или находил уникальные элементы вместо общих. Удачи в программировании!