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

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

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

Сначала создадим новый файл для нашего скрипта.

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

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

cd ~/project

Эта команда изменяет текущую директорию на папку проекта. Символ ~ представляет домашнюю директорию, а /project - подпапка внутри нее.

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

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

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

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

Теперь начнем писать наш скрипт, добавив шебанг (shebang) и инициализировав наши массивы.

  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. Эта строка является обязательной для любого шелл-скрипта.
  • Затем мы инициализируем три массива: 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, которые хранятся в массиве z.
  • Мы сравниваем элементы из 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.

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

Итоги

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

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

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

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