read — чтение значений со стандартного ввода
Встроенная команда read используется для чтения единственной строки со стандартного ввода. Эту команду можно использовать для чтения ввода с клавиатуры или, в случае перенаправления, строки данных из файла. Команда имеет следующий синтаксис:
read [-параметры] [переменная...]
где параметры — это один или несколько параметров из перечисленных в табл. 28.1, а переменная — имя одной или нескольких переменных для сохранения введенного значения. Если имя переменной не указано, строка с данными сохраняется в переменной REPLY.
Таблица 28.1. Параметры команды read
Параметр
Описание
-a массив
Сохранить ввод в указанный массив, начиная с элемента с индексом 0. Подробнее о массивах рассказывается в главе 35
-d разделитель
Использовать в качестве признака конца ввода первый символ из строки разделитель, а не символ перевода строки
-e
Использовать Readline для обработки ввода. Это позволяет редактировать ввод так же, как в командной строке
-n число
Прочитать указанное число символов, а не всю строку
-p приглашение
Показывать указанное приглашение к вводу
-r
Режим без промежуточной обработки. Не интерпретировать символы обратного слеша как экранирующие символы
-s
Безмолвный режим. Не производить эхо-вывод символов на экран в процессе ввода. Этот режим может пригодиться для организации ввода паролей и другой конфиденциальной информации
-t секунды
Предельное время ожидания. Завершить ввод по истечении указанного числа секунд. По истечении указанного интервала read вернет ненулевое значение
-u дескриптор
Произвести ввод из файла с указанным дескриптором вместо стандартного ввода
В простейшем случае read сохраняет значения полей, прочитанные со стандартного ввода, в указанные переменные. Ниже показано, как можно было бы изменить наш сценарий проверки целочисленных значений, задействовав в нем команду read:
#!/bin/bash
# read-integer: проверка целочисленного значения.
echo -n "Please enter an integer -> "
read int
if [[ "$int" =~ ^-?[0-9]+$ ]]; then
if [ $int -eq 0 ]; then
echo "$int is zero."
else
if [ $int -lt 0 ]; then
echo "$int is negative."
else
echo "$int is positive."
fi
if [ $((int % 2)) -eq 0 ]; then
echo "$int is even."
else
echo "$int is odd."
fi
fi
else
echo "Input value is not an integer." >&2
exit 1
fi
Сначала мы использовали команду echo с параметром -n (подавляющим вывод символа перевода строки в конце) для вывода приглашения к вводу, а затем команду read для ввода значения в переменную int. Запуск этого сценария приводит к следующим результатам:
[me@linuxbox ~]$ read-integer
Please enter an integer -> 5
5 is positive.
5 is odd.
Команда read может сохранять ввод в множестве переменных, это показано в следующем сценарии:
#!/bin/bash
# read-multiple: чтение нескольких значений с клавиатуры
echo -n "Enter one or more values > "
read var1 var2 var3 var4 var5
echo "var1 = '$var1'"
echo "var2 = '$var2'"
echo "var3 = '$var3'"
echo "var4 = '$var4'"
echo "var5 = '$var5'"
Этот сценарий вводит, присваивает переменным и выводит до пяти значений. Обратите внимание, как действует команда read, когда получает разное число значений:
[me@linuxbox ~]$ read-multiple
Enter one or more values > a b c d e
var1 = 'a'
var2 = 'b'
var3 = 'c'
var4 = 'd'
var5 = 'e'
[me@linuxbox ~]$ read-multiple
Enter one or more values > a
var1 = 'a'
var2 = ''
var3 = ''
var4 = ''
var5 = ''
[me@linuxbox ~]$ read-multiple
Enter one or more values > a b c d e f g
var1 = 'a'
var2 = 'b'
var3 = 'c'
var4 = 'd'
var5 = 'e f g'
Если read получит число значений меньше, чем ожидается, переменные, для которых не хватило значений, останутся пустыми, а при избыточном количестве значений на входе последняя переменная получит весь остаток введенной строки.
Если не передать переменные команде read, весь ввод будет сохранен в переменной командной оболочки REPLY:
#!/bin/bash
# read-single: чтение множества значений в переменную по умолчанию
echo -n "Enter one or more values > "
read
echo "REPLY = '$REPLY'"
Запуск этого сценария приводит к следующим результатам:
[me@linuxbox ~]$ read-single
Enter one or more values > a b c d
REPLY = 'a b c d'