Полное руководство по команде read в скриптах оболочки Linux: от ввода пользователя до построчного чтения файлов

Введение

В этой статье рассматриваются ключевые способы применения команды read, которая необходима для обработки интерактивного пользовательского ввода и парсинга текстовых данных при написании скриптов Bash в Linux. Вы сможете полностью освоить всё: от базовой обработки ввода до маскирования паролей (-s), таймаутов (-t), разделения по разделителю (IFS) и наиболее часто используемой на практике построчной обработки файлов с помощью цикла while.

1. Основы команды read, приглашение ввода (-p) и значения по умолчанию

Для создания отдельного рабочего пространства и перехода в него выполните команду mkdir -p ~/read-demo && cd ~/read-demo.

mkdir -p ~/read-demo && cd ~/read-demo

Команда read считывает одну строку со стандартного потока ввода и сохраняет её в переменную. Опция -p позволяет вывести приглашение для пользователя, а синтаксис ${변수명:-기본값} (${имя_переменной:-значение_по_умолчанию}) используется для подстановки значения по умолчанию, если значение переменной пусто.
В результате выполнения, поскольку ввод не был передан напрямую в команду read, переменная username осталась пустой, и согласно синтаксису ${username:-guest} было выведено значение по умолчанию guest.
⚙️ [Основные опции]

-p : задаёт строку приглашения (prompt), отображаемую на экране перед получением ввода.
-s : включает скрытый режим, в котором вводимые символы не отображаются на экране (полезно для паролей и конфиденциальных данных).
-t : задаёт ограничение по времени ожидания ввода (в секундах); по истечении указанного времени ввод завершается.
-n : считывает только указанное количество символов и завершает ввод немедленно, без нажатия клавиши Enter.
-r : предотвращает обработку обратного слэша (\) как escape-символа, считывая строку в исходном виде.
-a : разбивает введённые слова по пробелам и последовательно сохраняет их в переменную-массив.
-d : задаёт собственный символ-разделитель (delimiter) для завершения ввода вместо символа новой строки.

bash -c ‘read -p “사용자 이름을 입력하세요: " username; echo “입력된 사용자: ${username:-guest}” «< “tester”’

2. Маскирование пароля (-s) и ограничение времени ввода (-t)

Чтобы продолжить практику, перейдите в ранее созданный каталог ~/read-demo, выполнив команду cd ~/read-demo.

cd ~/read-demo

Ввод данных выполняется с маскированием отображения с помощью опции -s и ограничением по времени в 5 секунд с помощью опции -t 5.
Пароль был успешно передан в пределах установленного времени, и код возврата ($?) вывел 0.

bash -c ‘read -t 5 -sp “비밀번호를 입력하세요 (5초 제한): " userpass; echo; echo “입력 완료 여부: $?” «< “secret1234”’

3. Разделение на несколько переменных и массив с использованием разделителя (IFS) и опции -a

Чтобы продолжить практику, перейдите в ранее созданный каталог ~/read-demo, выполнив команду cd ~/read-demo.

cd ~/read-demo

Установив внутренний разделитель полей (IFS) равным запятой (,), считываем строку формата CSV, переданную через Here-String (<<<), с помощью команды read и сохраняем её по отдельности в переменные col1, col2 и col3.
В результате выполнения имя сервера, IP-адрес и имя службы, содержащиеся в строке, были корректно разделены по указанному разделителю и выведены в соответствующих переменных.

bash -c ‘IFS=”,” read -r col1 col2 col3 «< “server01,192.168.1.10,nginx”; echo “서버: $col1 | IP: $col2 | 서비스: $col3”’

Задав разделитель (IFS) двоеточием (:) и используя опцию -a, сохраняем строку формата /etc/passwd в массив user_info.
Нулевой индекс массива — имя учётной записи (root) — и шестой индекс — путь к командной оболочке (/bin/bash) — были успешно извлечены и выведены на экран.

bash -c ‘IFS=":" read -ra user_info «< “root:x:0:0:root:/root:/bin/bash”; echo “계정명: ${user_info[0]}, 셸: ${user_info[6]}”’

4. Практика: построчная обработка больших файлов с помощью цикла while и read -r

Чтобы продолжить практику, перейдите в ранее созданный каталог ~/read-demo, выполнив команду cd ~/read-demo.

cd ~/read-demo

Для практики построчной обработки файлов создаём тестовый CSV-файл servers.csv, в котором имена серверов и их статус разделены запятыми.

echo -e “server-web,running\nserver-db,stopped\nserver-cache,running” > servers.csv

Совместное использование цикла while и команды read -r с установкой внутреннего разделителя полей (IFS) в виде запятой (,) позволяет безопасно считывать строки файла servers.csv по одной.
В результате выполнения имя каждого сервера и информация о его статусе, записанные в файле, были успешно распределены по переменным name и status и выведены в заданном формате.

while IFS="," read -r name status; do echo “[상태 점검] $name 서버는 현재 $status 상태입니다.”; done < servers.csv

Мы рассмотрели основные способы применения команды read в скриптах оболочки Linux — от базового синтаксиса до часто используемых практических приёмов построчного чтения файлов.
Используя разобранные опции и примеры, попробуйте самостоятельно создать интерактивные скрипты автоматизации под свои задачи.