Home Space Utilization ($USER)
$(du -sh $HOME)
_EOF_
fi
return
}
Здесь проверяется вывод команды id. Если вызвать команду id с параметром -u, она выведет числовой идентификатор действующего пользователя. Суперпользователю всегда присваивается числовой идентификатор 0. Зная это, мы сконструировали два разных вложенных документа: один пользуется преимуществом привилегий суперпользователя, а другой ограничивается домашним каталогом текущего пользователя.
Теперь мы немного отдохнем от программы sys_info_page, но не волнуйтесь. Мы еще вернемся к нему. А пока затронем те темы, знание которых потребуется, когда мы возобновим разработку.
28. Чтение ввода с клавиатуры
В сценариях, написанных нами до сих пор, отсутствует одно свойство, характерное для многих компьютерных программ, — интерактивность, то есть возможность взаимодействия с пользователем. Несмотря на то что многие программы не нуждаются в интерактивности, некоторые только выиграли бы, если бы имели возможность принимать ввод непосредственно от пользователя. Возьмем для примера сценарий из предыдущей главы:
#!/bin/bash
# test-integer2: проверка целочисленного значения.
INT=-5
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 "INT is not an integer." >&2
exit 1
fi
Каждый раз, когда потребуется изменить значение INT, вы должны будете изменить сценарий. Пользоваться сценарием было бы удобнее, если бы он предлагал пользователю ввести значение. В этой главе мы посмотрим, как придать интерактивность нашим программам.
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 может сохранять ввод в множестве переменных, это показано в следующем сценарии:
Читать дальше