Найти в Дзене

#1 Bash. Создание файлов. Взаимодействие с пользователем. 3 вида цикла for. RANDOM. regex

Оглавление
Bash. Guide
Bash. Guide

Коротко: Bash скрипт. Как создать файлы | Цикл for - 3 вида | Запрос данных у пользователя | Создать функцию | mkdir | read -p | RANDOM | regex | local | readonly | tee -a | проверка на существование файла / каталога и др.

Что необходимо сделать:

Написать скрипт на Bash, который создаст в текущей директории 10 файлов с расширением .txt, с названиями в духе "video_record-2025-11-09_21.14.14.txt" — с рандомными датами, чтобы протестировать работу программы.

Данное упражнение создано в рамках учебно-тренировочных занятий. Для абсолютных начинающих.

Не является полным исчерпывающим руководством. Это часть диалога о том, на что необходимо обратить внимание при написании Bash‑скриптов.

Для новичков такие задания встречаются довольно часто, как, например, взаимодействие с пользователем, создание директорий, изменений прав доступа и тому подобное.

Начнем с того, что заходим в консоль и пишем команду:

1. touch создать файл для bash скрипта

touch command Linux console
touch command Linux console

2. chmod 777 ./our_script.sh

Присвоим полные права доступа к файлу
Присвоим полные права доступа к файлу

3. code. Как запустить VScode с консоли (командной строки linux)

-4

4. shebang - (#!/bin/bash)

"Запускай этот файл с помощью программы bash (оболочки командной строки)"

Без неё система не знает, как выполнять скрипт, точнее кто это должен делать?

Когда вы запускаете ./create_test_files.sh, система читает эту строку и передаёт файл в bash для выполнения.

Для Python будет своя строчка.

5. for i in {1..10} - первый вариант

-5

Цикл начинает с i = 1.

6. RANDOM

  • day=$((RANDOM % 31 + 1))

Создаёт переменную day и присваивает ей рандомное число.

  • $((...)) — арифметика в Bash.
  • RANDOM — встроенная переменная, дающая случайное число от 0 до 32767.
  • % 31 — остаток от деления на 31 (даёт 0–30), + 1 добавляет 1 (итог: 1–31, как дни месяца).

7. Форматирование строки

  • name="video_lambda-2025-11-${day}_${hour}.${min}.${sec}.mp4". Создаёт переменную name с текстом имени файла.
  • ${day} вставляет значение переменной day (Bash заменяет ${day} на число, например, 15).

8. echo. Создать файл

  • echo "текст" > "$name" .
  • echo — команда, которая печатает текст на экран, но знак `>` перенаправляет вывод в файл (создаёт файл и записывает текст).

Если файл есть, перезапишет; если нет, создаст. Файл появится в текущей директории.

  • Если надо дописать файл, то используйте знак `>>`

Этот вариант имеет недостатки.

1. Файлы создаются там же, где находится скрипт, — что мешает нормальной работе. Необходимо добавить каталог и создавать файлы там.

2. Каждый раз необходимо читать скрипт и понимать, что он делает.

3. Каждый раз менять названия файлов в самом скрипте.

4. Отдельно руками изменять права доступа к созданным файлам.

Дополним скрипт.

-6

9. mkdir Создать каталог в текущей директории

  • Команда mkdir (make directory) создаёт новый каталог в текущей директории. Если каталог уже существует, она выдаст ошибку (но скрипт продолжит работать).

10. chmod 777 Присвоить права 777 каталогу (чтение, запись, выполнение для всех)

  • chmod 777 test_videos. Команда chmod (change mode) устанавливает права доступа к файлу или каталогу.
  • 777 означает полные права (rwx — read, write, execute) для владельца, группы и всех остальных.

Изменение в цикле:

  • Имя файла теперь собирается как "test_videos/$name", чтобы файл создавался внутри каталога.
  • После создания файла добавлена строка chmod 777 "test_videos/$name": Это присваивает права 777 каждому файлу.
-7

Второй вариант присвоить всем файлам за один раз:

chmod 777 test_videos/*

Присвоить права 777 всем файлам внутри каталога.

Уже лучше, но недостаточно:

1. У нас есть изменяемые параметры - это название каталога, содержание файла и др. Поэтому изначально нужны были переменные.

2. У нас есть повторяющиеся математические операции с рандомом. поэтому просится функция.

3. Нет проверки, существуют ли искомый каталог?

4. Нет проверок: смогли ли мы записать в файлы, смогли ли их создать.

-8

11. set -e Прерывать скрипт при ошибке (exit on error)

Прерывание при ошибке делает скрипт более надёжным (не продолжает после неудачи).

12. Создание глобальных переменных

Переменные: DIR_NAME, NUM_FILES, CONTENT — вынесены наверх, чтобы их можно было легко изменить.

13. Функция generate_random()

Функция для генерации рандомного числа в диапазоне [min, max].

Вместо повторения $((RANDOM % ...)) — переиспользуемая функция. Принцип DRY (Don't Repeat Yourself).

  • local min=$1
  • Внутри функции local делает переменную локальной (видна только внутри функции, не снаружи).
  • $1 — первый аргумент, переданный в функцию (например, при вызове generate_random 1 31 -> это 1, а $2 - это 31 ).
  • local предотвращает конфликты с другими переменными.

-9

14. Проверка существования каталога

  • if [[ ! -d "$DIR_NAME" ]]
  • Вот тут я бы хотел заострить внимание на том, что между скобками и восклицательным знаком [[ ! стоит пробел. Точно также пробел перед закрывающими скобками. ЭТО ВАЖНО! Иначе будет ошибка.

-10

15. Цикл for - второй вариант. Использование с seq

  • for i in $(seq 1 "$NUM_FILES")

16. Обработка ошибок

  • if echo ... > "$filepath"; then ... else exit 1 — проверяет успех создания файла. >&2 перенаправляет ошибки в stderr.

-11

2>/dev/null — подавляет ошибки (например, если файлов нет)

Но всё равно хотелось бы интерактивности.

Задавать вопросы пользователю и забирать ответы в код

-12

17. read -p Запрос параметров у пользователя

  • read - команда для чтения ввода от пользователя.
  • -p добавляет приглашение (prompt) — текст перед вводом.
  • После двоеточия пользователь вводит текст, который сохраняется в переменную DIR_NAME.
  • Скрипт "останавливается" здесь, ждёт ввода. Пример: Пользователь вводит "my_text", DIR_NAME станет "my_text". Если не ввести ничего и нажать Enter, DIR_NAME будет пустой.
  • if [[ -z "$DIR_NAME" ]] -z проверяет, пустая ли строка

18. regex Регулярное выражение

  • В коде вводимое число должно быть положительным целым числом.
  • if с отрицанием `!` — проверяет, НЕ соответствует ли регулярному выражению.
  • [[ "$NUM_FILES" =~ ^[0-9]+$ ]] — regex: `^` начало, [0-9]+ одна или больше цифр, `$` конец. Проверяет, что это положительное целое число.
  • `||` — ИЛИ; [[ "$NUM_FILES" -le 0 ]] — меньше или равно 0. Если НЕ цифры ИЛИ <=0, ошибка.
  • Regex — как шаблон для текста.
  • `-le` — меньше или равно. Защищает от ввода "abc" или "-5".

-13

Я не буду приводить полностью код здесь этого варианта, он для самых увлекающихся. Только отмечу фокус на следующем:

19. Обработка ответа от пользователя

Будет правильно, если мы будем проверять ответ от пользователя. Другими словами, наша проверка того, что пользователь вводит число, должна стать функцией и использоваться в коде.

Например:

-14

Мы наше регулярное выражение перенесли отдельно в функцию.

А вот так мы будем ее использовать:

-15

Мы задаем вопрос пользователю, получаем ответ в переменную num_files.

Передаем эту переменную в функцию для проверки условия.

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

20. Логируйте работу Вашего скрипта

Если скрипт очень много чего делает, то необходимо проверять - всё ли закончилось успехом. Установились ли все программы и тд.

21. tee -a выводит на экран и добавляет в файл (append)

echo "$(date): Создан файл: $filepath" | tee -a "$LOG_FILE"

Спасибо всем, кто дочитал. Успехов всем нам.

Мой канал https://t.me/qt_cpp_linux

Мой Rutube канал