обучение linux урок 14

Цель урока: Научить наши скрипты выполнять однотипные действия многократно без нашего участия. Мы изучим два основных типа циклов: for (для перебора элементов в списке) и while (для выполнения команд, пока истинно некое условие). Это ключ к автоматизации таких задач, как обработка множества файлов, создание резервных копий или мониторинг состояния системы.

Часть 1: Теория. Зачем нужны циклы?

Представьте, что вам нужно переименовать 100 файлов, добавив к каждому расширение .bak. Вы можете 100 раз вручную ввести команду mv, но это долго, утомительно и можно легко ошибиться.

Цикл - это конструкция в программировании, которая позволяет выполнить один и тот же блок кода несколько раз подряд. Вы пишете код для обработки одного файла, "оборачиваете" его в цикл, и система сама применяет его ко всем 100 файлам.

В Bash есть два главных вида циклов для разных сценариев:

  1. Цикл for: Идеален, когда у вас есть конкретный, конечный список элементов, и вам нужно что-то сделать с каждым из них.

    • Аналогия: Рабочий на конвейере, перед которым лежит ящик с 20 деталями. Он берет первую деталь, обрабатывает ее, откладывает. Берет вторую, обрабатывает, откладывает. И так до тех пор, пока детали в ящике не закончатся.

    • Примеры задач: переименовать все файлы в папке, проверить статус каждого сайта из списка, скопировать несколько каталогов.

  2. Цикл while: Идеален, когда вы не знаете точное количество повторений, но знаете условие, при котором нужно остановиться.

    • Аналогия: Охранник, который должен обходить территорию, пока не наступит 6 утра. Он не знает, сколько кругов он сделает (может 50, может 51), но он знает условие прекращения работы.

    • Примеры задач: ждать, пока не освободится место на диске; проверять доступность сервера каждые 5 минут, пока он не ответит; читать файл строка за строкой до его конца.

Часть 2: Практика. Цикл for - перебор элементов списка

Синтаксис:

for ПЕРЕМЕННАЯ in СПИСОК_ЭЛЕМЕНТОВ
do
    # Блок команд, который будет выполняться
    # для каждого элемента из списка.
    # Внутри блока мы можем использовать $ПЕРЕМЕННАЯ
done
  • forindodone - это ключевые слова, они всегда такие.

  • ПЕРЕМЕННАЯ - это временное имя, которое вы придумываете. В него по очереди будут помещаться элементы из списка.

  • СПИСОК_ЭЛЕМЕНТОВ - это то, что мы перебираем: слова, числа, имена файлов.

Пример 1: Простой перебор слов
Давайте создадим скрипт, который просто поздоровается с несколькими именами из списка.

Шаг 1: Создание файла
Перейдем в наш каталог со скриптами и создадим новый файл с помощью nano.

cd ~/scripts
nano for_example_1.sh

Шаг 2: Вставка кода
Вставьте в редактор следующий код:

#!/bin/bash

# Простой пример цикла for для перебора списка имен

echo "Начинаем перекличку:"

for name in Иван Мария Петр
do
    # Этот блок кода выполнится 3 раза
    echo "Привет, $name!"
done

echo "Перекличка окончена."

Как это работает:

  1. Цикл for видит список из трех элементов: "Иван", "Мария", "Петр".

  2. Первый круг: Он берет "Иван", помещает его в переменную name и выполняет команду echo "Привет, Иван!".

  3. Второй круг: Он берет "Мария", помещает его в переменную name и выполняет команду echo "Привет, Мария!".

  4. Третий круг: Он берет "Петр", помещает его в переменную name и выполняет команду echo "Привет, Петр!".

  5. Список заканчивается, цикл завершает свою работу.

Шаг 3: Сохранение, права и запуск

  1. Сохраните файл (Ctrl+OEnterCtrl+X).

  2. Дайте права на исполнение:

    chmod +x for_example_1.sh
  3. Запустите скрипт:

    ./for_example_1.sh

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

Шаг 1: Подготовка - создадим тестовые файлы
Находясь в папке ~/scripts, создадим несколько пустых файлов для эксперимента:

touch app.log
touch system.log
touch access.log
touch script.sh # Этот файл цикл должен проигнорировать

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

nano for_example_2.sh

Шаг 3: Вставка кода

#!/bin/bash

# Пример использования цикла for для обработки файлов

echo "Поиск лог-файлов в текущем каталоге..."

# Звездочка (*) - это "шаблон", означающий "любые символы".
# Таким образом, *.log - это список всех файлов, заканчивающихся на .log
for logfile in *.log
do
    echo "--- Найден файл: $logfile ---"
    echo "Выводим первые 2 строки этого файла:"
    # Команда head -n 2 показывает первые 2 строки файла
    head -n 2 "$logfile"
    echo "" # Пустая строка для красоты вывода
done

echo "Обработка лог-файлов завершена."

Шаг 4: Сохранение, права и запуск

  1. Сохраните файл.

  2. Дайте права на исполнение: chmod +x for_example_2.sh

  3. Запустите: ./for_example_2.sh

Вы увидите, как скрипт по очереди "нашел" каждый .log файл и выполнил для него блок команд.

Часть 3: Практика. Цикл while - повторение до выполнения условия

Синтаксис:

while [ УСЛОВИЕ ]
do
    # Блок команд, который будет выполняться
    # снова и снова, пока УСЛОВИЕ истинно.
done
  • whiledodone - ключевые слова.

  • [ УСЛОВИЕ ] - это в точности та же самая конструкция для проверки, которую мы использовали в Уроке 13 с if. Используются те же ключи (-eq-lt-f и т.д.).

Пример: Простой счетчик
Напишем скрипт, который считает от 1 до 5.

Шаг 1: Создание файла

nano while_example.sh

Шаг 2: Вставка кода

#!/bin/bash

# Пример цикла while, который работает как счетчик

# 1. Инициализируем переменную-счетчик. Даем ей стартовое значение.
COUNTER=1

# 2. Цикл будет работать, ПОКА значение счетчика меньше или равно 5.
while [ $COUNTER -le 5 ]
do
    # 3. Выполняем полезное действие
    echo "Текущее число: $COUNTER"
    
    # 4. ВАЖНЕЙШИЙ ШАГ: Изменяем счетчик!
    # Увеличиваем его значение на 1.
    # Если этого не сделать, цикл будет бесконечным!
    COUNTER=$((COUNTER + 1))
done

echo "Счет окончен."

Как это работает:

  1. Переменной COUNTER присваивается значение 1.

  2. while проверяет условие: 1 меньше или равно 5? Да, истина.

  3. Выполняется блок do...done: выводится "Текущее число: 1", и COUNTER становится равен 2.

  4. Цикл начинается заново. while проверяет условие: 2 меньше или равно 5? Да, истина.

  5. ...и так далее, пока COUNTER не станет равен 6.

  6. while проверяет условие: 6 меньше или равно 5? Нет, ложь.

  7. Цикл завершается, и скрипт продолжает работу после слова done.

Шаг 3: Сохранение, права и запуск

  1. Сохраните файл.

  2. Дайте права на исполнение: chmod +x while_example.sh

  3. Запустите: ./while_example.sh

Итоги урока и домашнее задание

  • Что мы освоили:

    • Назначение циклов - автоматизация повторяющихся задач.

    • Цикл for используется для перебора элементов из готового списка.

    • Цикл while используется для повторения действий, пока истинно некое условие.

    • Синтаксис for ... in ... do ... done и while [ ... ] do ... done.

    • Важность изменения условия внутри цикла while во избежание "бесконечных циклов".

  • Ваше задание:
    Задача - написать скрипт archiver.sh, который найдет все файлы с расширением .txt в папке ~/scripts и для каждого из них создаст отдельный .zip архив.

    Требования к заданию:

    1. Сначала создайте несколько тестовых текстовых файлов в папке ~/scripts. Выполните команду:

      touch ~/scripts/doc1.txt ~/scripts/doc2.txt ~/scripts/report.txt
    2. Создайте файл скрипта archiver.sh с помощью nano.

    3. Используйте цикл for для перебора всех файлов, заканчивающихся на .txt. Шаблон для поиска будет *.txt.

    4. Внутри цикла для каждого найденного файла (например, doc1.txt) нужно выполнить команду архивации. Для создания zip-архива используется утилита zip. Если она не установлена, установите ее (apt install zip).

    5. Команда для архивации выглядит так: zip имя_архива.zip имя_файла. Ваш скрипт должен создавать архив с таким же именем, как у файла, но с расширением .zip (например, для doc1.txt должен создаться doc1.txt.zip).

    6. Внутри цикла добавьте команду echo, которая будет сообщать пользователю, какой файл сейчас архивируется, например: Архивирую файл: doc1.txt...

    7. Сделайте скрипт исполняемым и запустите его. После выполнения проверьте командой ls, что у вас появились новые zip-архивы.

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

Перейти к просмотру - УРОК №15.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)