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'