Коротко: 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‑скриптов.
Для новичков такие задания встречаются довольно часто, как, например, взаимодействие с пользователем, создание директорий, изменений прав доступа и тому подобное.
- Видео этого кода на dzen: #1 Bash. Создание файлов. Взаимодействие с пользователем. 3 вида цикла for. RANDOM. regex
Начнем с того, что заходим в консоль и пишем команду:
1. touch создать файл для bash скрипта
2. chmod 777 ./our_script.sh
3. code. Как запустить VScode с консоли (командной строки linux)
4. shebang - (#!/bin/bash)
"Запускай этот файл с помощью программы bash (оболочки командной строки)"
Без неё система не знает, как выполнять скрипт, точнее кто это должен делать?
Когда вы запускаете ./create_test_files.sh, система читает эту строку и передаёт файл в bash для выполнения.
Для Python будет своя строчка.
5. for i in {1..10} - первый вариант
Цикл начинает с 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. Отдельно руками изменять права доступа к созданным файлам.
Дополним скрипт.
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 каждому файлу.
Второй вариант присвоить всем файлам за один раз:
chmod 777 test_videos/*
Присвоить права 777 всем файлам внутри каталога.
Уже лучше, но недостаточно:
1. У нас есть изменяемые параметры - это название каталога, содержание файла и др. Поэтому изначально нужны были переменные.
2. У нас есть повторяющиеся математические операции с рандомом. поэтому просится функция.
3. Нет проверки, существуют ли искомый каталог?
4. Нет проверок: смогли ли мы записать в файлы, смогли ли их создать.
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 предотвращает конфликты с другими переменными.
14. Проверка существования каталога
- if [[ ! -d "$DIR_NAME" ]]
- Вот тут я бы хотел заострить внимание на том, что между скобками и восклицательным знаком [[ ! стоит пробел. Точно также пробел перед закрывающими скобками. ЭТО ВАЖНО! Иначе будет ошибка.
15. Цикл for - второй вариант. Использование с seq
- for i in $(seq 1 "$NUM_FILES")
16. Обработка ошибок
- if echo ... > "$filepath"; then ... else exit 1 — проверяет успех создания файла. >&2 перенаправляет ошибки в stderr.
2>/dev/null — подавляет ошибки (например, если файлов нет)
- Можно посмотреть видео этого кода: #1 Bash. Создание файлов. Взаимодействие с пользователем. 3 вида цикла for. RANDOM. regex
Но всё равно хотелось бы интерактивности.
Задавать вопросы пользователю и забирать ответы в код
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".
- В видео есть еще дополнительный вариант улучшения кода на dzen: #1 Bash. Создание файлов. Взаимодействие с пользователем. 3 вида цикла for. RANDOM. regex
Я не буду приводить полностью код здесь этого варианта, он для самых увлекающихся. Только отмечу фокус на следующем:
19. Обработка ответа от пользователя
Будет правильно, если мы будем проверять ответ от пользователя. Другими словами, наша проверка того, что пользователь вводит число, должна стать функцией и использоваться в коде.
Например:
Мы наше регулярное выражение перенесли отдельно в функцию.
А вот так мы будем ее использовать:
Мы задаем вопрос пользователю, получаем ответ в переменную num_files.
Передаем эту переменную в функцию для проверки условия.
Если там что то не то, мы в цикле еще раз задаем вопрос. И так пока не получим данные, чтобы пройти дальше.
20. Логируйте работу Вашего скрипта
Если скрипт очень много чего делает, то необходимо проверять - всё ли закончилось успехом. Установились ли все программы и тд.
21. tee -a выводит на экран и добавляет в файл (append)
echo "$(date): Создан файл: $filepath" | tee -a "$LOG_FILE"
Спасибо всем, кто дочитал. Успехов всем нам.
Мой канал https://t.me/qt_cpp_linux
Мой Rutube канал