Введение
В этом лабораторном занятии (LabEx) вы познакомитесь с чтением ввода в скриптах Linux-оболочки. Чтение ввода - это фундаментальный навык для создания интерактивных скриптов оболочки, которые могут реагировать на ввод пользователя. Изучив, как использовать команду read, вы сможете собирать и обрабатывать данные, введенные пользователями, делая свои скрипты более универсальными и удобными для пользователя.
В этом лабораторном занятии вы научитесь считывать ввод пользователя, обрабатывать этот ввод в своих скриптах и создавать интерактивные скрипты оболочки, которые могут динамически реагировать на различные входные данные пользователя. Эти навыки являются обязательными для написания эффективных инструментов и скриптов командной строки в Linux-окружениях.
Базовое чтение ввода
Команда read - это встроенная команда оболочки, которая считывает строку ввода со стандартного ввода (обычно с клавиатуры) и присваивает ее переменным. Это позволяет скриптам получать и обрабатывать ввод пользователя.
В этом шаге вы создадите простой скрипт, который считывает ввод пользователя и выводит его обратно пользователю.
Сначала убедитесь, что вы находитесь в директории проекта:
cd /home/labex/projectСоздайте новый файл скрипта с именем
input_reader.sh:touch input_reader.shСделайте скрипт исполняемым:
chmod +x input_reader.shОткройте файл скрипта с помощью текстового редактора nano:
nano input_reader.shДобавьте следующий код в скрипт:
#!/bin/bash ## A simple script to demonstrate basic input reading echo "Please enter your name:" read name echo "Hello, $name! Welcome to Linux input reading."Этот скрипт:
- Начинается с шебанга (
#!/bin/bash), который указывает, что скрипт должен запускаться с использованием bash - Выводит приглашение, запрашивающее имя пользователя
- Использует команду
readдля захвата введенного пользователем текста и сохраняет его в переменной с именемname - Выводит приветствие, включающее имя, введенное пользователем
- Начинается с шебанга (
Сохраните файл, нажав
Ctrl+O, затем нажмитеEnter, чтобы подтвердить имя файла, и выйдите из nano, нажавCtrl+X.Запустите скрипт для тестирования:
./input_reader.shВы должны увидеть вывод, похожий на следующий:
Please enter your name: John Hello, John! Welcome to Linux input reading.Фактический вывод будет отображать любое имя, которое вы ввели вместо "John".
Команда read ожидает ввода пользователя и сохраняет его в одной или нескольких переменных. В этом примере ввод был сохранен в одной переменной с именем name. Позже вы узнаете, как захватывать несколько вводов с помощью одной команды read.
Использование read в циклах
В этом шаге вы улучшите свой скрипт, чтобы он непрерывно считывал ввод с использованием цикла до достижения определенного условия выхода. Этот шаблон часто используется в интерактивных скриптах, где вам нужно собрать несколько частей информации от пользователя.
Откройте свой скрипт для редактирования:
nano input_reader.shЗамените существующее содержимое следующим кодом:
#!/bin/bash ## Enhanced script with a loop for multiple inputs echo "Enter multiple inputs (type 'exit' to quit):" while true; do ## Prompt for input echo -n "> " read input ## Check if user wants to exit if [[ "$input" == "exit" ]]; then echo "Exiting the input reader." break fi ## Process the input echo "You entered: $input" done echo "Thank you for using the input reader!"Этот скрипт:
- Использует цикл
while trueдля создания бесконечного цикла, который будет продолжать принимать ввод - Выводит приглашение (
>) перед каждым вводом с помощьюecho -n, которое предотвращает добавление новой строки - Считывает ввод пользователя в переменную
input - Проверяет, является ли ввод равным "exit", и выходит из цикла, если это так
- В противном случае выводит введенный текст обратно пользователю
- Наконец, выводит сообщение о благодарности после выхода из цикла
- Использует цикл
Сохраните файл, нажав
Ctrl+O, затем нажмитеEnter, чтобы подтвердить имя файла, и выйдите из nano, нажавCtrl+X.Запустите улучшенный скрипт:
./input_reader.shВы должны увидеть вывод, похожий на следующий:
Enter multiple inputs (type 'exit' to quit): > hello You entered: hello > world You entered: world > exit Exiting the input reader. Thank you for using the input reader!
Эта структура цикла особенно полезна, когда вам нужно последовательно обработать несколько вводов, например, при создании простого интерфейса командной строки или инструмента для ввода данных. Оператор break используется для выхода из цикла, когда пользователь вводит "exit", но вы можете изменить условие выхода в соответствии с любыми нужными вам критериями.
Чтение с подсказками и значениями по умолчанию
В этом шаге вы узнаете, как задавать значения по умолчанию для ввода и использовать опцию -p для создания более чистых подсказок. Это полезно, когда вы хотите дать пользователям возможность просто нажать Enter, чтобы принять предложенное значение.
Откройте свой скрипт для редактирования:
nano input_reader.shЗамените существующее содержимое следующим кодом:
#!/bin/bash ## Script demonstrating read with default values ## Using -p flag for prompt and providing default with || operator read -p "Enter your country (default: USA): " country country=${country:-USA} echo "Country set to: $country" ## Another example with a default value read -p "Enter your preferred programming language (default: Bash): " language language=${language:-Bash} echo "Programming language set to: $language" ## Combining with a timeout using -t option echo "Quick response needed:" read -t 5 -p "What is your favorite color? (You have 5 seconds, default: Blue): " color color=${color:-Blue} echo "Favorite color set to: $color"Этот скрипт:
- Использует флаг
-pдля отображения подсказки в той же командеread, делая код более компактным - Применяет синтаксис
${variable:-default}для установки значения по умолчанию, если ввод пользователя пуст - Демонстрирует опцию
-t, которая устанавливает тайм-аут для ввода (5 секунд в этом примере)
- Использует флаг
Сохраните файл, нажав
Ctrl+O, затем нажмитеEnter, чтобы подтвердить имя файла, и выйдите из nano, нажавCtrl+X.Запустите скрипт для тестирования:
./input_reader.shПопробуйте следующие сценарии:
- Введите название страны при появлении подсказки, затем нажмите Enter
- Просто нажмите Enter (не вводя ничего), чтобы принять значение по умолчанию
- В примере с тайм-аутом попробуйте подождать более 5 секунд, чтобы увидеть, что произойдет
Пример вывода при принятии значений по умолчанию:
Enter your country (default: USA): Country set to: USA Enter your preferred programming language (default: Bash): Programming language set to: Bash Quick response needed: What is your favorite color? (You have 5 seconds, default: Blue): Favorite color set to: Blue
Опция -p в команде read позволяет вам предоставить подсказку в той же команде, делая ваши скрипты более чистым и читаемым. Синтаксис ${variable:-default} - это мощная функция оболочки, которая подставляет значение по умолчанию, когда переменная не установлена или пуста, что идеально подходит для предоставления значений по умолчанию в скриптах.
Чтение конфиденциального ввода и нескольких переменных
В этом последнем шаге вы узнаете две более продвинутые техники:
Чтение защищенного ввода (например, паролей) без отображения символов на экране
Чтение нескольких переменных с помощью одной команды
readОткройте свой скрипт для редактирования:
nano input_reader.shЗамените существующее содержимое следующим кодом:
#!/bin/bash ## Script demonstrating secure input and multiple variable reading ## Secure input reading with -s flag (no echo) echo "Secure Input Example:" read -p "Username: " username read -s -p "Password: " password echo ## Add a newline after password input echo "Username entered: $username" echo "Password length: ${#password} characters" ## Reading multiple variables at once echo -e "\nMultiple Variable Example:" read -p "Enter first name, last name, and age (separated by spaces): " first_name last_name age echo "First name: $first_name" echo "Last name: $last_name" echo "Age: $age" ## Reading with a custom delimiter echo -e "\nCustom Delimiter Example:" read -p "Enter comma-separated values: " -d "," value1 echo ## Add a newline echo "First value before comma: $value1" echo -e "\nThank you for completing this lab on Linux input reading!"Этот скрипт:
- Использует флаг
-sс командойreadдля скрытия ввода (полезно для паролей или другой конфиденциальной информации) - Показывает, как прочитать несколько переменных из одной строки ввода, передав несколько имен переменных в команду
read - Демонстрирует флаг
-dдля указания пользовательского разделителя (вместо стандартного символа новой строки)
- Использует флаг
Сохраните файл, нажав
Ctrl+O, затем нажмитеEnter, чтобы подтвердить имя файла, и выйдите из nano, нажавCtrl+X.Запустите скрипт для тестирования:
./input_reader.shПример вывода (ваши вводы будут отличаться):
Secure Input Example: Username: john_doe Password: Username entered: john_doe Password length: 8 characters Multiple Variable Example: Enter first name, last name, and age (separated by spaces): John Doe 30 First name: John Last name: Doe Age: 30 Custom Delimiter Example: Enter comma-separated values: test, First value before comma: test Thank you for completing this lab on Linux input reading!
Безопасность имеет важное значение при обработке конфиденциальной информации, такой как пароли. Флаг -s гарантирует, что введенные символы не отображаются на экране. Обратите внимание, что в примере с паролем скрипт показывает только длину пароля для подтверждения, а не сам пароль.
Чтение нескольких переменных сразу может сделать ваши скрипты более эффективными и удобными для пользователя. Когда команде read передаются несколько имен переменных, она разбивает ввод на основе переменной окружения IFS (Internal Field Separator), которая по умолчанию представляет собой пробелы (пробелы, табуляции и новые строки).
Флаг -d позволяет вам изменить разделитель, который сигнализирует об окончании ввода. По умолчанию команда read останавливается при встрече символа новой строки (когда вы нажимаете Enter), но вы можете изменить его на любой символ, например, запятую в примере.
Резюме
В этом практическом занятии вы узнали основные техники чтения и обработки пользовательского ввода в скриптах Linux bash:
Базовое чтение ввода: Использование команды
readдля считывания пользовательского ввода в переменные.Ввод на основе циклов: Реализация циклов для непрерывного чтения ввода до выполнения определенного условия.
Значения по умолчанию и подсказки: Установка значений по умолчанию для ввода и создание более чистых скриптов с встроенными подсказками.
Продвинутые техники: Чтение защищенного ввода без отображения его на экране, считывание нескольких переменных в одной команде и использование пользовательских разделителей.
Эти навыки чтения ввода являются фундаментальными для создания интерактивных скриптов оболочки, которые могут адаптироваться к пользовательскому вводу, предоставлять соответствующие значения по умолчанию и обрабатывать различные типы данных. Теперь вы можете применить эти техники для создания более отзывчивых и удобных для пользователя инструментов и скриптов командной строки.
По мере дальнейшего развития своих навыков работы с Linux, рассмотрите возможность сочетания этих методов чтения ввода с другими функциями bash, такими как условные операторы, функции и операции с файлами, чтобы создать более сложные и мощные инструменты для автоматизации и управления системой.



